繁体   English   中英

在awk循环中访问bash数组

[英]Access a bash array in awk loop

我有一个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开始与指数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

据我了解,您只需要以正确的方式为abk数组提供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 ,因此您不必关心索引,因此可以正常调用它们,而不必担心bash中的索引从0开始。

还要注意的是print a,b是相同的(和清洁剂)作为print a OFS b ,既然你已经定义OFSBEGIN块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM