簡體   English   中英

所有列的所有行的總和 - Bash

[英]Sum of all rows of all columns - Bash

我有一個這樣的文件

1 4 7 ...
2 5 8
3 6 9 

我想作為輸出

6 15 24 ...

這是所有列的所有行的總和。 我知道要對某個列(比如第 1 列)的所有行求和,您可以這樣做:

awk '{sum+=$1;}END{print $1}' infile > outfile

但我不能對所有列自動執行此操作。

有一個非常簡單的命令numsum可以執行此操作:

numsum -c FileName

-c   ---    Print out the sum of each column.

例如:

cat FileName
1 4 7 
2 5 8
3 6 9 

輸出 :

numsum -c FileName
6 15 24

注意:如果您的系統中沒有安裝該命令,您可以使用以下命令進行安裝:

apt-get install num-utils

您想以不同的方式對每一列求和。 因此,您需要一個數組,而不是一個標量:

$ awk '{for (i=1;i<=NF;i++) sum[i]+=$i} END{for (i in sum) print sum[i]}' file
6
15
24

這存儲sum[column]並最終打印它。

要在同一行中輸出,請使用:

$ awk '{for (i=1;i<=NF;i++) sum[i]+=$i} END{for (i in sum) printf "%d%s", sum[i], (i==NF?"\n":" ")}' file
6 15 24

這使用了技巧printf "%d%s", sum[i], (i==NF?"\\n":" ") :打印數字 + 一個字符。 如果我們在最后一個字段,讓這個字符成為新行; 否則,只是一個空間。

echo "1 4 7
2 5 8
3 6 9 " \
| awk '{for (i=1;i<=NF;i++){
   sums[i]+=$i;maxi=i}
 }
 END{
   for(i=1;i<=maxi;i++){
     printf("%s ", sums[i])
   }
 print}'

輸出

6 15 24

我記得你不能依賴for (i in sums)來生成任何特定順序的密鑰,但也許這在新版本的 gawk 中是“固定的”。

如果您使用的是老式 Unix awk,此解決方案將使您的輸出保持相同的列順序,無論您的文件有多“寬”。

IHTH

再來一張awk

awk '{for(i=1;i<=NF;i++)$i=(a[i]+=$i)}END{print}' file

輸出

6 15 24

解釋

{for (i=1;i<=NF;i++)         Set field to 1 and increment through

$i=(a[i]+=$i)                Set the field to the sum + the value in field

END{print}                   Print the last line which now contains the sums

與其他答案一樣,這將保留字段的順序,而不管它們的數量如何。

AWK計划

#!/usr/bin/awk -f

{
    print($0);
    len=split($0,a);
    if (maxlen < len) {
        maxlen=len;
    }
    for (i=1;i<=len;i++) {
        b[i]+=a[i];
    }
}

END {
    for (i=1;i<=maxlen;i++) {
        printf("%s ", b[i]);
    }
    print ""
}

輸出

1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
3 6 9 12 15 

你的回答是正確的。 只是錯過了打印“sum”。 嘗試這個:

awk '{sum+=$1;} END{print sum;}' infile > outfile

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM