alternative to readarray, because it does not work on mac os x

后端 未结 7 1995
挽巷
挽巷 2021-01-17 16:55

I have a varsValues.txt file

cat varsValues.txt
aa=13.7
something=20.6
countries=205
world=1
languages=2014
people=7.2
oceans=3.4

And I wou

相关标签:
7条回答
  • 2021-01-17 17:17

    Here's the awk version. Note that NPars is not hardcoded.

    vars=($(awk -F= '{print $1}' varsValues.txt))
    values=($(awk -F= '{print $2}' varsValues.txt))
    
    Npars=${#vars[@]}
    
    for ((i=0; i<$Npars; i++)); do
        eval ${vars[$i]}=${values[$i]}
    done
    
    echo $people
    
    0 讨论(0)
  • 2021-01-17 17:17

    You can use declare bulletin:

    declare -a vars=( $(cut -d '=' -f1 varsValues.txt) )
    declare -a values=( $(cut -d '=' -f2 varsValues.txt) )
    
    0 讨论(0)
  • 2021-01-17 17:25

    Figured I'd toss this in here: https://raw.githubusercontent.com/AdrianTP/new-environment-setup/master/utils/readarray.sh

    #!/bin/bash
    # from: https://peniwize.wordpress.com/2011/04/09/how-to-read-all-lines-of-a-file-into-a-bash-array/
    readarray() {
      local __resultvar=$1
      declare -a __local_array
      let i=0
      while IFS=$'\n' read -r line_data; do
          __local_array[i]=${line_data}
          ((++i))
      done < $2
      if [[ "$__resultvar" ]]; then
        eval $__resultvar="'${__local_array[@]}'"
      else
        echo "${__local_array[@]}"
      fi
    }
    

    I keep this in a "utils" folder in my "new-environment-setup" Github repo, and I just clone it down and import it whenever I need to read a file into an array of lines an array get a new computer or wipe my drive. It should thus act as a backfill for readarray's shortcomings on Mac.

    Import looks like:

    # From: https://stackoverflow.com/a/12694189/771948
    DIR="${BASH_SOURCE%/*}"
    if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi
    . "$DIR/utils/readarray.sh"
    

    Usage looks like readarray "<output_var_name>" "<input_file_name>".

    Yes it's a little rough. Sorry about that. It may not even work correctly anymore, but it did at one point, so I thought I would share it here to plant the idea of simply...writing your own backfill.

    0 讨论(0)
  • 2021-01-17 17:28
    perl -0777 -nE '@F= split /[=\r\n]/; say "@F[grep !($_%2), 0..$#F]"; say "@F[grep $_%2, 0..$#F]"' varsValues.txt
    

    or by reading same file twice,

    perl -F'=' -lane 'print $F[0]' varsValues.txt
    perl -F'=' -lane 'print $F[1]' varsValues.txt
    
    0 讨论(0)
  • 2021-01-17 17:34

    You could use a read loop.

    while IFS=\= read var value; do
        vars+=($var)
        values+=($value)
    done < VarsValues.txt
    
    0 讨论(0)
  • 2021-01-17 17:36

    Let's start with this:

    $ awk -F'=' '{values[$1]=$2} END{print values["people"]}' file
    7.2
    
    $ awk -F'=' '{values[$1]=$2} END{for (name in values) print name, values[name]}' file
    languages 2014
    oceans 3.4
    world 1
    something 20.6
    countries 205
    people 7.2
    aa 13.7
    

    Now - what else do you need to do?

    0 讨论(0)
提交回复
热议问题