awk在维度上的累积总和

时间:2018-01-25 16:29:57

标签: awk

下午好,

我想为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

但我想打印所有的行和列。

你有什么想法吗?

2 个答案:

答案 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。你的数学似乎对行总和来说是错误的