
您好,我需要獲取文件中每一列的總和,需要靈活地處理任何給定文件中的盡可能多的列
目前我使用:
awk '{for (i=1;i<=NF;i++) sum[i]+=$i;}; END{for (i in sum) print sum[i];}'
然而,這只給了我第一列的總和,我顯然可以循環它,但我更喜歡更簡單的東西。
有什麼想法/答案嗎?
答案1
它做給出每列的總和,但在一列中(前提是資料以空格分隔):
$ cat data.in
1 2
3 4
5 6
$ awk '{ for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) print sum[i] }' data.in
12
9
所以這是一個問題不在每個總和之間輸出換行符。
$ awk '{ for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) printf("%d ", sum[i]); printf("\n") }' data.in
12 9
該printf()
函數採用格式字串。是%d
整數的格式化字串(用於%f
浮點數),整數後面也會輸出以下空格。然後,我們在循環後輸出顯式換行符。
另一種解決方法是使用ORS
(“輸出記錄分隔符號”)變數:
$ awk 'BEGIN { ORS=" " } { for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) print sum[i]; printf("\n") }' data.in
12 9
另請參閱 Dave Thompson 在下面的評論中關於 Awk 關聯數組中鍵的排序(不保證排序)的富有洞察力的警告。
答案2
perl -lane '$sum[$_] += $F[$_] for 0..$#F; END {print join $", @sum}' data.in