我的 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
由于某种原因,它给我的数据添加了另一列,但没关系,我可以使用它。