我有一个这样的文件
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)
与其他答案一样,无论字段数量有多少,这都将保留字段的顺序。
您想要对每一列进行不同的求和。因此,您需要一个数组,而不是标量:
$ 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":" ")
:打印数字+一个字符。如果我们在最后一个字段,则让该字符成为换行符;否则,只是一个空格。
有一个非常简单的命令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)
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
归档时间: |
|
查看次数: |
7528 次 |
最近记录: |