下午好,
我想为awk中的每个列和行创建一个累积总和。
我的档案是:
1 2 3 4
2 5 6 7
2 3 6 5
1 2 1 2
我想:每栏
1 2 3 4
3 7 9 11
5 10 15 16
6 12 16 18
6 12 16 18
我想:每行
1 3 5 9 9
2 7 13 20 20
2 5 11 16 16
1 3 4 6 6
我将每列的总和作为:
awk '{ for (i=1; i<=NF; ++i) sum[i] += $i}; END { for (i in sum) printf "%s ", sum[i]; printf "\n"; }' test.txt # sum
并且每行。
awk '
BEGIN {FS=OFS=" "}
{
sum=0; n=0
for(i=1;i<=NF;i++)
{sum+=$i; ++n}
print $0,"sum:"sum,"count:"n,"avg:"sum/n
}' test.txt
但我想打印所有的行和列。
你有什么想法吗?
答案 0 :(得分:4)
看起来您拥有所有可用的正确信息,您所缺少的只是打印输出声明。
这是你在找什么?
列的累计总和:
% cat foo
1 2 3 4
2 5 6 7
2 3 6 5
1 2 1 2
% awk '{ for (i=1; i<=NF; ++i) {sum[i]+=$i; $i=sum[i] }; print $0}' foo
1 2 3 4
3 7 9 11
5 10 15 16
6 12 16 18
行的累计总和:
% cat foo
1 2 3 4
2 5 6 7
2 3 6 5
1 2 1 2
% awk '{ sum=0; for (i=1; i<=NF; ++i) {sum+=$i; $i=sum }; print $0}' foo
1 3 6 10
2 7 13 20
2 5 11 16
1 3 4 6
这两个都使用以下内容:
0
(如果以数字方式使用)$i
替换为sum
值print $0
答案 1 :(得分:2)
重复最后一个元素的行和
$ awk '{s=0; for(i=1;i<=NF;i++) $i=s+=$i; $i=s}1' file
1 3 6 10 10
2 7 13 20 20
2 5 11 16 16
1 3 4 6 6
$i=s
将索引值(现在递增到NF + 1)设置为总和,1
打印带有该额外字段的行。
列与重复的最后一行相加
$ awk '{for(i=1;i<=NF;i++) c[i]=$i+=c[i]}1; END{print}' file
1 2 3 4
3 7 9 11
5 10 15 16
6 12 16 18
6 12 16 18
END{print}
重复最后一行
PS。你的数学似乎对行总和来说是错误的