readarray的替代品,因为它不适用于mac os x

时间:2014-05-24 07:06:59

标签: macos perl bash awk

我有一个varsValues.txt文件

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

我想创建2个数组,变量和值。它应该包含

echo ${vars[@]}
aa something countries world languages people oceans

echo ${values[@]}
13.7 20.6 205 1 2014 7.2 3.4

我用

Npars=7

readarray -t vars < <(cut -d '=' -f1 varsValues.txt)
readarray -t values < <(cut -d '=' -f2 varsValues.txt)

for (( yy=0; yy<$Npars; yy++ )); do
eval ${vars[$yy]}=${values[$yy]}
done

echo $people
7.2

但我希望它没有readarray,它不适用于Mac(os x)和IFS(interfield separater)。

还有其他解决方案吗? AWK? Perl的?我可以在我的bash脚本中使用它。

感谢。

7 个答案:

答案 0 :(得分:4)

您可以使用读取循环。

while IFS=\= read var value; do
    vars+=($var)
    values+=($value)
done < VarsValues.txt

答案 1 :(得分:3)

这是awk版本。请注意,NPars不是硬编码的。

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

答案 2 :(得分:1)

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

或两次读同一文件,

perl -F'=' -lane 'print $F[0]' varsValues.txt
perl -F'=' -lane 'print $F[1]' varsValues.txt

答案 3 :(得分:1)

您可以使用declare公告:

declare -a vars=( $(cut -d '=' -f1 varsValues.txt) )
declare -a values=( $(cut -d '=' -f2 varsValues.txt) )

答案 4 :(得分:1)

让我们从这开始:

$ 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

现在 - 您还需要做什么?

答案 5 :(得分:0)

想通了,我想在这里扔这个:https://raw.githubusercontent.com/AdrianTP/new-environment-setup/master/utils/readarray.sh

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

我将其保存在我的“ new-environment-setup” Github存储库中的“ utils”文件夹中,当需要将文件读入行数组时,只要将其克隆并导入即可,电脑或擦拭我的驱动器。因此,它应该作为Mac上readarray缺点的补充。

导入看起来像:

readarray "<output_var_name>" "<input_file_name>"

用法看起来像 id1 id2 Page_nbr record_type St1 Sc1 3 START Sc1 St1 5 ADD Sc1 St1 9 OTHER Sc2 St2 34 START Sc2 St2 45 DURATION Sc2 St2 65 END Sc3 Sc3 4 START

是的,这有点粗糙。对于那个很抱歉。它甚至可能无法正常工作,但它确实在某一时刻起作用了,所以我想在这里分享它,以种植简单地...编写自己的回填的想法。

答案 6 :(得分:0)

尝试:

IFS=$'\n' vars=($(cut -d '=' -f1 varsValues.txt))
IFS=$'\n' values=($(cut -d '=' -f2 varsValues.txt))