[英]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.