awk输出元素乱序

时间:2014-02-06 23:41:28

标签: arrays bash csv awk

在我的bash脚本中,我尝试使用csv文件中的元素创建两个并行数组。 csv文件中可以包含5-40行。

Array1=($(awk -F, '{a[$1];}END{for (i in a)print i;}' list.csv))
Array2=($(awk -F, '{b[$2];}END{for (i in b)print i;}' list.csv))

然而,在执行此操作后,数组中元素的顺序与文件不匹配,它们甚至不相互匹配。这就像awk随机获取线条。为什么会发生这种情况,我该如何解决?谢谢!

3 个答案:

答案 0 :(得分:2)

关联数组索引不按顺序保存。您正在看到awk内部索引的影响。

相反,您可以按照您想要的顺序添加它们,然后按顺序打印它们:

Array1=($(awk -F, '!a[$1]++ { b[n++]=$1; } END{for (i=0; i<n; i++) print b[i];}' list.csv))

但是,您甚至不需要将它们全部存储起来。如果您只想要每个副本中的第一个:

Array1=($(awk -F, '!a[$1]++ { print $1; }' list.csv))

!a[$1]++是一个常见的技巧,当你第一次看到变量时(a[$1]在未设置时被视为0,这是真的。++下一次递增它。)。

答案 1 :(得分:1)

Array1=($(awk -F, 'BEGIN{i=0;}{a[i++]=$1;}END{for(x=0;x<i;x++) print a[x];}' list.csv))
Array2=($(awk -F, 'BEGIN{i=0;}{b[i++]=$2;}END{for(x=0;x<i;x++) print b[x];}' list.csv))

在awk中你有关联数组,所以当你执行for时,你不确定你是否会按照你将它们放入的相同顺序获取值。 如果你想让它们被命令使用一个计数器作为索引和一个普通的for循环而不是for in。

答案 2 :(得分:1)

你当然不需要awk来完成这项任务:你不必两次读取文件:

array1=()
array2=()
while IFS=, read -r a b; do
    array1+=( "$a" )
    array2+=( "$b" )
done < list.csv