文件中每列的總和,需要靈活地處理與文件中一樣多的列

文件中每列的總和,需要靈活地處理與文件中一樣多的列

您好,我需要獲取文件中每一列的總和,需要靈活地處理任何給定文件中的盡可能多的列

目前我使用:

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

相關內容