如何用单脚本按第一列分组计算第三列最大值与第二大值的比值
单脚本实现方案
直接用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
实现逻辑
- 先对原文件做排序:按第一列
S1分组,组内按第三列C1数值倒序排列,排序后同一个S1的行连续排列,且C1值从大到小依次排列 awk遍历排序后的结果:- 表头行直接输出,新增
Ratio列 - 遇到新的
S1值时,先输出上一个S1的计算结果,再初始化当前S1的最大值、对应S2值,标记要取接下来的第二大值 - 同一个
S1的第二行就是第二大C1值所在行,直接记录即可 - 遍历结束后输出最后一个
S1的计算结果
- 表头行直接输出,新增
- 最后用
column -t做对齐,输出格式和预期一致
输出结果
S1 S2 C1 Ratio B B1 19 1.58333 A AA 10 2.00000
如果不需要保留小数点后5位的末尾0,把printf里的%.5f改成%g即可。
内容的提问来源于stack exchange,提问作者Ashi
相关产品推荐
相关产品推荐

