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

如何用单脚本按第一列分组计算第三列最大值与第二大值的比值

单脚本实现方案

直接用sort配合单轮awk即可实现,无需生成中间临时文件,12万行数据处理效率远高于分步方案:

sort -k1,1 -k3,3nr F1.txt | awk '
NR==1 {
    print $0 "\tRatio"
    next
}
$1 != cur_s1 {
    if (cur_s1 != "") {
        printf "%s\t%s\t%s\t%.5f\n", cur_s1, max_s2, max_c, max_c/second_c
    }
    cur_s1 = $1
    max_s2 = $2
    max_c = $3
    take_second = 1
    next
}
take_second {
    second_c = $3
    take_second = 0
}
END {
    printf "%s\t%s\t%s\t%.5f\n", cur_s1, max_s2, max_c, max_c/second_c
}' | column -t

实现逻辑

  1. 先对原文件做排序:按第一列S1分组,组内按第三列C1数值倒序排列,排序后同一个S1的行连续排列,且C1值从大到小依次排列
  2. awk遍历排序后的结果:
    • 表头行直接输出,新增Ratio列
    • 遇到新的S1值时,先输出上一个S1的计算结果,再初始化当前S1的最大值、对应S2值,标记要取接下来的第二大值
    • 同一个S1的第二行就是第二大C1值所在行,直接记录即可
    • 遍历结束后输出最后一个S1的计算结果
  3. 最后用column -t做对齐,输出格式和预期一致

输出结果

S1  S2  C1  Ratio
B   B1  19  1.58333
A   AA  10  2.00000

如果不需要保留小数点后5位的末尾0,把printf里的%.5f改成%g即可。

内容的提问来源于stack exchange,提问作者Ashi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:39:03