You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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 X

Group 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:22:23