在 awk 循环中访问 bash 数组
Posted
技术标签:
【中文标题】在 awk 循环中访问 bash 数组【英文标题】:Access a bash array in awk loop 【发布时间】:2015-09-01 02:50:31 【问题描述】:我有一个类似的 bash 数组
myarray = (1 2 3 4 5 ... n)
另外我正在读取一个只有一行输入的文件,例如:
1 2 3 4 5 ... n
我正在将它逐行读取到一个数组中并打印:
awk 'BEGINFS=OFS="\t"
NR>=1for (i=1;i<=NF;i++) a[i]+=$i
ENDfor (i=1;i<NF;i++) print OFS a[i]' myfile.txt
myarray
的大小与a
相同。现在myarray
以索引0
开始,a
以索引1
开始。我的主要问题是如何将 bash 数组传递给我的 awk 表达式,以便我可以在打印循环中使用它和相应的元素。所以我尝试的是这样的:
awk -v array="$myarray[*]"
'BEGINFS=OFS="\t"
NR>=1for (i=1;i<=NF;i++) a[i]+=$i
ENDfor (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】:据我了解,您只需要以正确的方式使用 bash 数组输入 awk
。也就是说,通过使用split()
:
awk -v bash_array="$myarray[*]"
'BEGINsplit(bash_array,array); FS=OFS="\t"
NR>=1for (i=1;i<=NF;i++) a[i]+=$i
ENDfor (i=1;i<NF;i++) print a[i], array[i]' file
由于数组array[]
现在在awk
中,因此您不必关心索引,因此您可以正常调用它们,而不必担心bash 中从0
开始的那些。
还请注意,print a,b
与 print a OFS b
相同(并且更简洁),因为您已经在 BEGIN
块中定义了 OFS
。
【讨论】:
谢谢。这就是问题所在!只是在一边:是否可以做类似OFS="\t\t"
的事情。因为有时我需要其中两个才能正确对齐数字。
@uitty400 当然可以,您可以使用echo "1 2 3" | awk 'BEGIN OFS="\t\t" print $1, $2'
进行测试。
@uitty400 你可能需要说BEGINFS="\t"; OFS="\t\t"
。甚至FS="\t"; OFS=FS FS
!! (我对此感到惊讶)
就是这样。感谢您的帮助!以上是关于在 awk 循环中访问 bash 数组的主要内容,如果未能解决你的问题,请参考以下文章