使用awk编程按第一列分组对文件最后一列数值求和
awk按第一列分组累加最后一列数值的实现方法
原代码问题分析
你写的代码存在三个问题:
- 未过滤
* * *格式的无效分隔行,会导致异常计算 - 没有按第一列做分组存储,仅针对单行做列求和后立即输出
- 每次计算完单行就重置累加变量,无法实现跨行的分组累加
正确实现代码
awk '$1 != "*" { sum[$1] += $NF } END { for (k in sum) printf "%.8f %.18g\n", k, sum[k] | "sort -n" }' input
代码逻辑说明
$1 != "*":匹配第一个字段不是*的有效数值行,直接跳过分隔行sum[$1] += $NF:以第一列的值为数组下标,将当前行最后一列的数值累加到对应下标存储的结果中END块为所有行处理完成后执行的逻辑:- 遍历累加数组
sum的所有键 printf指定输出格式:第一列保留8位小数和原输入格式对齐,第二列用%.18g保证浮点精度不丢失- 管道到
sort -n:对输出结果按第一列数值升序排序,和预期输出顺序一致
- 遍历累加数组
输出结果
执行后得到的结果完全符合需求:
1.00000000 0.000215890266919365 2.00000000 0.00423890266919365 3.00000000 0.00112948567706805 4.00000000 0.000814742838534025
内容的提问来源于stack exchange,提问作者manas
相关产品推荐
相关产品推荐

