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

时间:2014-11-24 12:33:52

标签: bash awk

我有一个像这样的文件

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

我希望得到输出

6 15 24 ...

这是所有列的所有行的总和。我知道要总结某一列的所有行(比如第1列),你可以这样做:

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

但我不能自动为所有列做这件事。

6 个答案:

答案 0 :(得分:3)

有一个非常简单的命令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

答案 1 :(得分:3)

再多一次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

与其他答案一样,这将保留字段的顺序,而不管它们的数量。

答案 2 :(得分:2)

您希望以不同方式对每列进行求和。因此,您需要一个数组,而不是标量:

$ 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":" "):打印数字+一个字符。如果我们在最后一个字段中,那么让这个字符成为新行;否则,只是一个空间。

答案 3 :(得分:1)

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)来生成任何特定订单的密钥,但也许这是&#34;固定&#34;在较新版本的gawk中。

如果您使用旧的Unix awk,此解决方案将使您的输出保持相同的列顺序,无论&#34; wide&#34;你的档案是。

IHTH

答案 4 :(得分:0)

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 

答案 5 :(得分:0)

您的答案是正确的。只是错过了打印“和”。试试这个:

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