如何用 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
我有一个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