簡體   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