AWK:对列求和,并将它们写入“最终”行

AWK:对列求和,并将它们写入“最终”行

我的 CSV 看起来像这样

A   5   3
B   3   1
...

我需要获取所有列的总和,并将它们添加到 CSV 中的新行,以便它变成

A   5   3
B   3   1
SUM 8   4

我能够通过执行此操作打印特定列的总和awk -F',' '{sum+=$2} END {print sum}' file.csv,但我需要对整个 CSV 文件夹执行此操作,最终必须向其中添加总和。也许数据集和“总和”列之间还有一个空行,但这只是额外的事情。

我是一名程序员,我可以用 Java 编写类似的东西,但我认为 AWK 可以让我们更快地实现这一目标。

谢谢

答案1

您可以使用类似这样的方法。它适用于具有任意列数的文件,假设第一列是文本,SUM结果行中应包含该列所有值的总和。

$ awk '{for(i=2;i<=NF;i++)a[i]+=$i;print $0} END{l="SUM";i=2;while(i in a){l=l" "a[i];i++};print l}' data.csv > final.csv
A   5   3
B   3   1
SUM 8 4

awk以更易读的方式格式化的代码:

{
    for (i=2 ; i<=NF ; i++)
        a[i] += $i
    print $0
}

END {
    l = "SUM"
    i=2
    while(i in a) {
        l = l " " a[i]
        i++
    }
    print l
}

答案2

在 StackOverflow 上发现了一些一开始对我不起作用的东西https://stackoverflow.com/a/27110024/2161301

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 ""
}' data.csv >> final.csv

由于某种原因,它给我的数据添加了另一列,但没关系,我可以使用它。

相关内容