awk 在维度上的累计和

标签 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

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

你有什么想法吗?

最佳答案

看起来您拥有所有可用的正确信息,您所缺少的只是打印输出声明。

这是您要找的吗?

列的累计和:

 % 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 重新打印整行

关于awk 在维度上的累计和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48447694/

相关文章:

bash 总和分组循环

linux - 匹配一个模式,插入模式,直到下一次匹配

awk - 想要求和时间 (00 :00:00) in AWK command

linux - 将文本附加到文件中仅第一列的末尾

swift - 使用 awk/sed 获取 swift 函数的返回类型

linux - 在线替换 bash(使用变量将行替换为新行)

linux - 带 FS 的 Shell awk 命令

regex - awk 和等价类

linux - 通过给定输入获取输出 -Linux

awk - 结合多个awk命令