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

aya*_*sha 4 bash awk

我有一个这样的文件

1 4 7 ...
2 5 8
3 6 9 
Run Code Online (Sandbox Code Playgroud)

我想作为输出

6 15 24 ...
Run Code Online (Sandbox Code Playgroud)

这是所有列的所有行的总和。我知道要对某个列(比如第 1 列)的所有行求和,您可以这样做:

awk '{sum+=$1;}END{print $1}' infile > outfile
Run Code Online (Sandbox Code Playgroud)

但我不能对所有列自动执行此操作。

小智 7

又一个 awk

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

输出

6 15 24
Run Code Online (Sandbox Code Playgroud)

解释

{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
Run Code Online (Sandbox Code Playgroud)

与其他答案一样,无论字段数量有多少,这都将保留字段的顺序。


fed*_*qui 5

您想要对每一列进行不同的求和。因此,您需要一个数组,而不是标量:

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

这会存储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
Run Code Online (Sandbox Code Playgroud)

这使用了技巧printf "%d%s", sum[i], (i==NF?"\n":" "):打印数字+一个字符。如果我们在最后一个字段,则让该字符成为换行符;否则,只是一个空格。


Kal*_*dhi 5

有一个非常简单的命令numsum可以执行此操作:

numsum -c FileName

-c   ---    Print out the sum of each column.
Run Code Online (Sandbox Code Playgroud)

例如:

cat FileName
1 4 7 
2 5 8
3 6 9 
Run Code Online (Sandbox Code Playgroud)

输出 :

numsum -c FileName
6 15 24
Run Code Online (Sandbox Code Playgroud)

注意: 如果您的系统中没有安装该命令,您可以使用以下命令进行安装:

apt-get install num-utils
Run Code Online (Sandbox Code Playgroud)


she*_*ter 3

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}'
Run Code Online (Sandbox Code Playgroud)

输出

6 15 24
Run Code Online (Sandbox Code Playgroud)

我记得你不能依赖for (i in sums)以任何特定顺序生成密钥,但也许这在较新版本的 gawk 中是“固定的”。

如果您使用的是老式 Unix awk,此解决方案将使您的输出保持相同的列顺序,无论您的文件有多“宽”。

IHTH