我有一个像这样的文件
1 4 7 ...
2 5 8
3 6 9
我希望得到输出
6 15 24 ...
这是所有列的所有行的总和。我知道要总结某一列的所有行(比如第1列),你可以这样做:
awk '{sum+=$1;}END{print $1}' infile > outfile
但我不能自动为所有列做这件事。
答案 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