我有像
这样的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
myarray
与a
的尺寸相同。现在myarray
以索引0
和a
开头,索引为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
答案 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}}。
另请注意,0
与print a,b
相同(且更干净),因为您已在print a OFS b
块中定义了OFS
。