使用AWK删除文本文件中含重复SOL编号的行
解决方法:基于SOL编号去重(无论位置)
你可以用下面的awk脚本来实现需求——它会追踪每个SOL编号的首次出现,只保留包含该编号的第一行,不管SOL在第一列还是第二列:
awk '{ # 遍历当前行的所有字段,定位以SOL开头的标识 for (i = 1; i <= NF; i++) { if ($i ~ /^SOL/) { sol_id = $i break } } # 仅当该SOL编号是首次出现时,打印当前行 if (!seen[sol_id]++) { print $0 } }' data.txt
工作原理
- 定位SOL编号:脚本会逐行检查每个字段,找到以
SOL开头的字符串(用正则/^SOL/匹配),把它存在sol_id变量里。 - 去重逻辑:用
seen数组记录每个SOL编号是否已经出现过。如果seen[sol_id]的值为0(首次出现),就打印当前行,同时把seen[sol_id]加1标记为已出现;如果已经标记过,就跳过该行。
示例验证
比如你的测试用例:
115993 SOL269 SOL269 84911 12373 SOL269
运行脚本后,只会输出第一行115993 SOL269,后两行因为SOL269已经出现过,会被自动过滤,完全符合你的要求。
和原有命令的区别
你之前用的awk '!seen[$0]++' data.txt是基于整行内容去重,只有当两行完全相同时才会删除重复项;而上面的脚本是基于SOL编号去重,只要行里包含的SOL编号已经出现过,不管整行内容是什么,都会被过滤。
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

