如何使用awk提取前4列相同分组的第5列最小值并保留唯一组合行
CSV分组取最小值行awk实现方案
可直接运行的代码
基础版(输出顺序不保证和分组首次出现顺序一致)
awk ' BEGIN { FS = "," OFS = "," } { key = $1 FS $2 FS $3 FS $4 if (!(key in min_val) || $5 < min_val[key]) { min_val[key] = $5 result[key] = $0 } } END { for (key in result) { print result[key] } } ' 你的输入文件路径.csv
保序版(输出顺序和分组首次出现顺序完全匹配,适配示例期望输出)
awk ' BEGIN { FS = "," OFS = "," } { key = $1 FS $2 FS $3 FS $4 # 首次遇到该分组时记录出现顺序 if (!(key in min_val)) { order[++count] = key min_val[key] = $5 result[key] = $0 } # 非首次遇到时仅当第5列更小才更新记录 else if ($5 < min_val[key]) { min_val[key] = $5 result[key] = $0 } } END { # 按分组首次出现顺序输出结果 for (i=1; i<=count; i++) { print result[order[i]] } } ' 你的输入文件路径.csv
实现原理说明
- 分隔符配置:BEGIN块中提前指定输入(FS)和输出(OFS)分隔符为逗号,无需额外处理CSV的字段拆分。
- 分组规则实现:将每行前4列拼接为唯一分组键,相同前4列的行会被归类到同一分组下。
- 最小值筛选逻辑:
- 首次遇到某分组时,直接保存当前行的第5列为分组最小值,同时保存整行内容
- 重复遇到同分组时,仅对比第5列数值,若当前行数值更小则更新分组最小值和对应的行记录
- 前4列唯一的分组只会被处理一次,会被直接保留,符合需求要求
- 结果输出:保序版额外通过数组记录分组首次出现的顺序,最终按该顺序输出结果,和示例期望的输出顺序完全一致。
内容的提问来源于stack exchange,提问作者Vinri Eclar
相关产品推荐
相关产品推荐

