AWK需求:按第一列分组保留第二列最大值的所有行(含重复行)
AWK按分组保留第二列最大值的所有重复行解决方案
需求说明
按第一列分组,保留每组中第二列数值最大的所有行(包括重复的最大值行)。
输入示例
a 55 a 66 a 130 b 88 b 99 b 99 c 110 c 130 c 130
期望输出
a 130 b 99 b 99 c 130 c 130
正确AWK实现
通过两次遍历文件的方式,先统计每组最大值,再筛选输出符合条件的行:
awk 'NR == FNR { # 第一次遍历:记录每个分组的第二列最大值 if ($2 > max[$1]) { max[$1] = $2 } next } # 第二次遍历:输出当前行第二列等于对应分组最大值的所有行 $2 == max[$1]' input.txt input.txt
代码解释
- 第一次遍历(
NR == FNR):NR是全局总行数,FNR是当前文件的行数。当两者相等时,处理第一个输入文件,遍历所有行并更新数组max,存储每个分组($1)对应的第二列最大值。 next:跳过后续语句,确保第一次遍历仅完成最大值统计工作。- 第二次遍历:处理第二个输入文件,检查当前行的第二列是否等于对应分组的最大值,符合条件则输出整行,自然保留所有重复的最大值行。
原代码问题分析
- 第一段代码:使用全局变量
max统计最大值,未按第一列分组,最终仅保留全局最大的行,不符合分组需求。 - 第二段代码:用
row[$1]存储行,但仅在遇到更大值时更新,相同最大值的后续行无法被记录,导致丢失重复的最大值行。
内容的提问来源于stack exchange,提问作者SWK
相关产品推荐
相关产品推荐

