如何用AWK按第6列唯一值计算第5列的最小最大值并追加至文件?
AWK解决方案:按第6列分组计算第5列极值并追加到文件
嘿,这个需求用AWK完全能搞定,我给你写个实用的脚本,还附上详细解释,保证你一看就懂!
核心思路
我们需要分两步走:
- 先遍历整个文件,一边输出原内容,一边按第6列的值分组记录第5列的最小值和最大值
- 遍历完成后,把每组的统计结果追加到文件末尾输出
通用AWK脚本(支持任意第6列取值)
这个脚本不需要提前知道第6列有哪些值,会自动识别新的分组并初始化极值:
awk ' { # 先输出当前行的原始内容 print $0 # 处理当前分组的极值:如果是新分组,用当前值初始化min和max;否则更新极值 if (!($6 in min_val)) { min_val[$6] = $5 max_val[$6] = $5 } else { if ($5 < min_val[$6]) min_val[$6] = $5 if ($5 > max_val[$6]) max_val[$6] = $5 } } END { # 打印分隔线,让原内容和统计结果区分开(可选,可根据需求删除) print "---" # 遍历所有分组,输出统计结果 for (key in min_val) { printf "Group %s: min=%.6e, max=%.6e\n", key, min_val[key], max_val[key] } } ' input.txt
针对已知第6列取值的优化脚本
如果已经确定第6列只有X和Y两种值,可以提前初始化极值,脚本会更高效一点:
awk ' BEGIN { # 初始化X、Y组的极值:min设为极大值,max设为极小值,确保第一个值能覆盖 min_val["X"] = 1e18; max_val["X"] = -1e18 min_val["Y"] = 1e18; max_val["Y"] = -1e18 } { print $0 # 直接更新对应分组的极值 if ($5 < min_val[$6]) min_val[$6] = $5 if ($5 > max_val[$6]) max_val[$6] = $5 } END { print "---" for (key in min_val) { printf "Group %s: min=%.6e, max=%.6e\n", key, min_val[key], max_val[key] } } ' input.txt
测试效果
输入示例
6:28866209 NA NA NA 8.51368e-06 Y
6:28856689 1 0.007828 1 1.50247e-06 X
6:28856740 2 0.007828 1 1.50247e-06 Y
6:28856889 3 7.51E-08 3 1.50247e-06 X
输出示例
6:28866209 NA NA NA 8.51368e-06 Y
6:28856689 1 0.007828 1 1.50247e-06 X
6:28856740 2 0.007828 1 1.50247e-06 Y
6:28856889 3 7.51E-08 3 1.50247e-06 XGroup X: min=1.502470e-06, max=1.502470e-06
Group Y: min=1.502470e-06, max=8.513680e-06
注意事项
- 脚本里的
input.txt替换成你的实际文件名即可 - 如果需要调整统计结果的输出格式,修改
END块里的printf语句就行,比如改成你需要的列格式 - 因为文件列数不固定,但第5、6列位置固定,AWK的
$5、$6会自动识别对应列,完全兼容多列情况
内容的提问来源于stack exchange,提问作者LauraC
相关产品推荐
相关产品推荐

