我有一堆数据,比如说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文件中的总和之一。我该如何解决?
我希望我已经设法将其清除
答案 0 :(得分:2)
像这样吗?
$ 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可以方便,干净地处理文件名列表,而无需使用管道。
答案 1 :(得分:2)
使用 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
答案 2 :(得分:1)
您可以将bash用于:
for file in *.mp3; do
awk -f sum.awk "$file"
done > output.txt
答案 3 :(得分:0)
一种选择是将每个文件的结果放入数组(由文件名索引)并在末尾打印:
final_grade
(可选)您可以将文件名捕获到变量中,并在FNR == 1以及END时打印:
awk '{a[FILENAME]+=$5} END{for(f in a) print f, a[f]}' *.xyz
答案 4 :(得分:0)
echo *.xyz | xargs -n 1 awk '{sum+=$5} END{print FILENAME,sum }' > output.txt
输出到output.txt(例如):
a0001.xyz 7 a0254.xyz 12