使用awk过滤文本文件:保留重复行中第二列最大值的条目
处理重复行并保留第二列最大值的方法
嘿,这个需求用命令行工具就能快速解决,我给你两个靠谱的方案,都是处理这类文本数据的常用操作:
方法一:用Awk直接统计最大值(推荐)
Awk是处理结构化文本的利器,我们可以遍历每一行,用第一列作为键,记录对应的最大第二列值,最后输出结果:
BEGIN { FS = "," # 设置输入分隔符为逗号 OFS = "\t" # 设置输出分隔符为制表符 } { # 清理第二列的前后空格(你的示例数据里有些值带多余空格) current_val = $2 gsub(/^[[:space:]]+|[[:space:]]+$/, "", current_val) # 如果当前键没记录过,或者当前值比已记录的最大值大,就更新 if (!($1 in max_values) || current_val > max_values[$1]) { max_values[$1] = current_val } } END { # 遍历输出所有键和对应的最大值 for (key in max_values) { print key, max_values[key] } }
使用方式:
- 将上述代码保存为
keep_max.awk文件 - 在终端运行命令:
awk -f keep_max.awk your_input_file.txt
或者直接用一行命令执行:
awk 'BEGIN {FS=","; OFS="\t"} {val=$2; gsub(/^[[:space:]]+|[[:space:]]+$/, "", val); if (!($1 in max) || val>max[$1]) max[$1]=val} END {for(k in max) print k, max[k]}' your_input_file.txt
方法二:先排序再去重
如果数据量不大,也可以先按第一列分组、第二列降序排序,再保留每个分组的第一行(也就是最大值行):
# 先按第一列排序,同一列内按第二列降序排列 sort -t',' -k1,1 -k2,2nr your_input_file.txt | # 只保留每个第一列的首次出现(即最大值行) awk -F',' '!seen[$1]++ { gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2) print $1 "\t" $2 }'
结果示例
针对你提供的示例数据,两种方法都会输出:
NDUFAF7 0.216216 ESRRA 0.214286 HS3ST1 0.0833333
内容的提问来源于stack exchange,提问作者user7249622
相关产品推荐
相关产品推荐

