如何用Bash批量计算CSV文件各数据列的求和值?
批量计算CSV多列求和的Awk解决方案
当然可以实现批量列求和!不用单独处理每一列,用Awk就能一次性完成所有列的计算,完全符合你的需求。
核心实现代码
下面是一个通用的Awk脚本,不管你的CSV有多少列(只要从第二列开始是数值),都能自动计算每列的总和:
BEGIN { FS = OFS = "," # 设置输入输出的分隔符为逗号 } # 第一行时记录总列数,避免重复计算 NR == 1 { total_cols = NF } # 遍历每一行的第2到最后一列,累加求和 { for (col = 2; col <= total_cols; col++) { column_sum[col] += $col } } # 最后输出结果行 END { printf "SUM" # 先输出结果行的表头 for (col = 2; col <= total_cols; col++) { printf "%s%d", OFS, column_sum[col] # 用逗号分隔每列的和 } print "" # 最后换行,保证输出格式正确 }
使用方法
- 把上面的代码保存为
sum_columns.awk文件 - 运行命令处理你的CSV文件(假设文件名为
test.txt):
awk -f sum_columns.awk test.txt
或者你也可以直接用一行命令执行,不用保存脚本:
awk 'BEGIN{FS=OFS=","} NR==1{total_cols=NF} {for(col=2;col<=total_cols;col++) column_sum[col]+=$col} END{printf "SUM"; for(col=2;col<=total_cols;col++) printf "%s%d",OFS,column_sum[col]; print ""}' test.txt
结果验证
用你提供的输入CSV:
ID_X,1,2,7,8 ID_Y,6,9,3,5 ID_Z,7,12,4,4
执行后会输出:
SUM,14,23,14,17
完全匹配你的预期结果!
额外注意事项
- 如果你的CSV中存在空值或者非数字内容,Awk会默认把它们当作
0处理。如果需要忽略这些无效值,可以在累加时加个判断:if ($col ~ /^[0-9.]+$/) { # 只处理数字(包括小数) column_sum[col] += $col } - 这个脚本是通用的,不管你的CSV有多少列,只要从第二列开始是需要求和的数值,都能正常工作。
内容的提问来源于stack exchange,提问作者Kuav
相关产品推荐
相关产品推荐

