繁体   English   中英

使用AWK对不同文件中的列求和

[英]Using AWK to sum column from different files

我有一堆名为a0001.xyz到a0254.xyz的数据。 我想对每个文件的第5列求和,并将答案写到名为output.txt的文件中。 所以我正在寻找一个包含每个.xyz文件总和的单列文件。

我已经尝试过这样的事情:

awk -f sum.awk a0004.xyz > output.txt

sum.awk在哪里

#sum.awk
{ sum+=$5}
END { print sum }

它给了我a0004.xyz文件第5列的总和,并将其写入output.txt。 问题是当我将命令更改为:

awk -f sum.awk *.xyz > output.txt

同样,它只给我所有.xyz文件中的总和之一。 我怎样才能解决这个问题?

我希望我已经设法把它弄清楚了

像这样吗

$ tail a*.xyz
==> a0001.xyz <==
1 2 3 4 5 6 7
2 3 4 5 6 7 8

==> a0254.xyz <==
3 4 5 6 7 8 9
4 5 6 7 8 9 10
$ awk '{a[FILENAME]+=$5} END {for (i in a) printf "%4d %s\n", a[i], i}' a*.xyz
  11 a0001.xyz
  15 a0254.xyz

这里的awk脚本将$5的值添加到以当前文件名命名的数组元素中。 处理完所有输入后,它将逐步遍历数组并打印结果,键是贡献给每个值的文件名。 Awk整洁且可移植地处理文件名列表,而无需管道。

GNU Parallel并行进行

parallel -k -q awk '{s+=$5} END{print FILENAME,s+0}' ::: a*xyz

样本输出

a0001.xyz 20
a0002.xyz 40
a0254.xyz 55

笔记:

  • -k表示“按顺序保留输出”
  • -q意思是“请引用我的awk内容,因为我很懒”
  • s+0表示将s视为数字,因此如果未设置,则输出0

或使用gawk

gawk '{s+=$5} ENDFILE{print FILENAME,s+0; s=0}' a*xyz

样本输出

a0001.xyz 20 
a0002.xyz 40
a0254.xyz 55

您可以将bash用于:

for file in *.mp3; do 
      awk -f sum.awk "$file"
done > output.txt

一种选择是将每个文件的结果放入数组(由文件名索引)并在末尾打印:

awk '{a[FILENAME]+=$5} END{for(f in a) print f, a[f]}' *.xyz

(可选)您可以将文件名捕获到变量中,并在FNR == 1以及END时打印:

awk 'FNR==1 && filename{print filename, sum; sum=0} {sum+=$1;filename=FILENAME} END{print filename, sum}' *.xyz
echo *.xyz | xargs -n 1 awk '{sum+=$5} END{print FILENAME,sum }' > output.txt

输出到output.txt(例如):

a0001.xyz 7
a0254.xyz 12

暂无
暂无

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

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