使用Awk求和CSV所有单元格并生成归一化列值CSV
用Awk实现多CSV文件的全单元格求和与列占比计算
我来帮你搞定这个需求——其实用一个Awk脚本就能一次性完成所有操作,不用分开处理单列求和和全文件计算。下面是具体的实现步骤和代码:
核心思路
我们需要同时完成两个计算:
- 所有CSV文件中所有单元格的总总和
- 每个列在所有文件中的列总和
最后将每个列总和除以总总和,生成一行的CSV结果文件。
完整Awk脚本
创建一个名为calc_col_ratios.awk的脚本文件,内容如下:
BEGIN { FS = "," # 设置CSV字段分隔符 } # 处理每一行数据 { # 遍历当前行的每一列,累加列总和和总总和 for (i = 1; i <= NF; i++) { col_sum[i] += $i total_sum += $i } } # 所有文件处理完成后输出结果 END { # 遍历所有列,输出每列的占比值(列总和/总总和) for (i = 1; i <= length(col_sum); i++) { if (i > 1) printf "," # 非第一列添加逗号分隔符 # 这里用%.10f控制小数精度,你可以根据需求调整位数(比如%.6f) printf "%.10f", col_sum[i] / total_sum } printf "\n" # 最后换行 }
使用方法
在你的CSV文件所在目录下,运行以下命令:
awk -f calc_col_ratios.awk *.csv > column_ratios.csv
*.csv会匹配目录下所有CSV文件(如果你的文件名有特殊规则,比如data_*.csv,可以替换成对应通配符)column_ratios.csv是生成的结果文件,里面只有一行,每列对应原CSV列的总和占总单元格和的比例。
关键细节说明
- 多文件处理:Awk会自动遍历你传入的所有CSV文件,不需要额外循环处理单个文件
- 列数兼容:因为你所有CSV都是84×84的矩阵,所以列数一致,脚本会自动处理84列的累加
- 精度控制:脚本中用
%.10f输出10位小数,你可以根据需要修改(比如改成%.6f输出6位,或者用%g自动去掉末尾的0)
如果你需要单独查看总单元格和,可以在END块里加一行print "Total sum:", total_sum,这样运行时会在终端输出总总和。
内容的提问来源于stack exchange,提问作者BennyD
相关产品推荐
相关产品推荐

