如何用 awk 对一列的值求和?

How do I sum values of a column cumulatively with awk?

我有一个sample.csv,想按列累加,如下:

Input csv:                        Output csv:
01/01/2020, 0, 0, 2, 1            01/01/2020, 0, 0, 2, 1
18/04/2022, 7, 5, 1, 3            18/04/2022, 7, 5, 3, 4
01/05/2022, 8,21, 9, 4            01/05/2022,15,26,12, 8

我试过了

awk '{ for (i=1; i<=NF; ++i) {sum[i]+=$i; $i=sum[i] }; print [=11=]}' sample.csv

但它 returns 是这样的:

Input csv:                        Output csv:
01/01/2020, 0, 0, 2, 1            01/01/2020, 0, 0, 2, 1, 0, 0, 0, 0, 0
18/04/2022, 7, 5, 1, 3            18/04/2022, 7, 5, 1, 3, 0, 0, 0, 0, 0
01/05/2022, 8,21, 9, 4            01/05/2022, 8,21, 9, 4, 0, 0, 0, 0, 0

我不知道如何解决这个问题。

注意:我是在 bash 脚本中写的,而不是终端。而且我不允许为此使用 awk 以外的任何工具

我无法复制你的输出。除了空格处理之外,这似乎可以满足您的要求:

awk '{ for (i=2; i<=NF; i+=1) {
    sum[i]+=$i; $(i)=sum[i]; 
}; print [=10=] }' FS=, OFS=, sample.csv

要获得所需的空格,您可以这样做:

 awk '{ 
     for (i=2; i<=NF; i+=1) {
         sum[i]+=$i; $(i)=sum[i]; 
     }
     printf "%s,%2d,%2d,%2d,%2d\n", , , , , 
 }' FS=, sample.csv

如果您不知道列数,您可以在循环中编写最终的 printf。

已测试并确认正在处理

  • gawk 5.1.1,
  • mawk 1.3.4,
  • mawk 1.9.9.6,以及
  • macos nawk

———————————————————————————————————————————— —

    # gawk profile, created Thu May 19 15:59:38 2022
    
    function fmt(_) {
        return +_<=_^(_<_) \
        ? "" : $_ = sprintf("%5.f",___[_]+=$_)
    }
    BEGIN { split(sprintf("%0*.f",((__=++_)+(++_*_)\
                                  )^++_,!_),___,"""")
            OFS = ", "
             FS = "[,][ ]*"
    } {       _ = NF                                    
        while(_!=__) { fmt(_--) } }_'

———————————————————————————————————————————— —

01/01/2020,     0,     0,     2,     1
18/04/2022,     7,     5,     3,     4
01/05/2022,    15,    26,    12,     8