在 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,bprint 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 数组的主要内容,如果未能解决你的问题,请参考以下文章

Linux awk 命令详解(二) if 分支 数组

将csv字符串读入bash数组

Bash:awk从数组项中删除括号

AWK中for循环调用数组解释

shell数组和awk数组

awk----利用循环统计个数