在awk循环中访问bash数组

时间:2015-06-16 10:25:45

标签: arrays bash awk

我有像

这样的bash数组
myarray = (1 2 3 4 5 ... n)

此外,我正在阅读一个只有一行输入的文件,例如:

1 2 3 4 5 ... n

我正在逐行将其读入数组并使用以下内容进行打印:

awk 'BEGIN{FS=OFS="\t"}
     NR>=1{for (i=1;i<=NF;i++) a[i]+=$i}
     END{for (i=1;i<NF;i++) print OFS a[i]}' myfile.txt

myarraya的尺寸相同。现在myarray以索引0a开头,索引为1。我的主要问题是如何将bash数组传递给我的awk表达式,以便我可以在打印循环中使用它与相应的元素。所以我试过的是:

awk -v array="${myarray[*]}"
    'BEGIN{FS=OFS="\t"}
     NR>=1{for (i=1;i<=NF;i++) a[i]+=$i}
     END{for (i=1;i<NF;i++) print OFS a[i] OFS array[i-1]}' myfile.txt

尽管如此,这仍然有效。我没有获得myarray的任何输出。此示例中我想要的输出是:

1   1
2   2
3   3
4   4
5   5
...
n   n

1 个答案:

答案 0 :(得分:2)

据我了解,您只需要以正确的方式向bash数组提供awk。也就是说,使用split()

awk -v bash_array="${myarray[*]}" 
     'BEGIN{split(bash_array,array); FS=OFS="\t"}
      NR>=1{for (i=1;i<=NF;i++) a[i]+=$i} 
      END{for (i=1;i<NF;i++) print a[i], array[i]}' file

由于数组array[]现在位于awk,因此您不必关心索引,因此您可以正常调用它们,而不必担心从{{ {1}}。

另请注意,0print a,b相同(且更干净),因为您已在print a OFS b块中定义了OFS