如何忽略前2列对文件内容去重?现有AWK方案存在局限
移除文件中重复内容(忽略前2列)
问题背景
需要处理文本文件,移除从第3列开始的内容完全重复的行,仅保留该内容第一次出现的对应行(前2列不参与重复判断)。此前尝试的awk '!seen[$3]++' sample.txt仅以第3列作为去重依据,无法覆盖第3列之后的内容,不符合需求。
示例输入
111 06:22 apples, bananas and pears 112 06:28 bananas 113 07:07 apples, bananas and pears 114 07:23 apples and bananas 115 08:01 bananas and pears 116 08:23 pears 117 09:22 apples, bananas and pears 118 12:23 apples and bananas
期望输出
111 06:22 apples, bananas and pears 112 06:28 bananas 114 07:23 apples and bananas 115 08:01 bananas and pears 116 08:23 pears
解决方案
方法1:提取从第3列到行尾的完整内容作为去重键
使用awk截取整行中从第3个字段起始到末尾的部分,以此作为判断重复的核心依据:
awk '{key=substr($0, index($0,$3)); if (!seen[key]++) print}' sample.txt
- 逻辑说明:
index($0,$3)定位第3个字段在整行的起始位置,substr($0, ...)截取从该位置到行尾的全部内容作为去重键;seen[key]记录该内容是否已出现,首次出现时打印当前行。
方法2:拼接第3列到最后一列的内容作为去重键
如果需要更精确控制字段间的空格处理,可以循环拼接从第3列到最后一列的内容:
awk '{key=""; for(i=3;i<=NF;i++) key=key $i " "; sub(/ $/,"",key); if(!seen[key]++) print}' sample.txt
- 逻辑说明:遍历第3到最后一个字段拼接成完整字符串,去掉末尾多余空格后作为去重键,首次出现时打印当前行。
原命令失效原因
原命令awk '!seen[$3]++' sample.txt仅以单个第3列作为去重依据,无法识别第3列之后的内容差异。比如示例中第1、3、7行的第3列都是apples,后续内容完全相同,原命令会正确去重,但如果某两行第3列相同但后续内容不同,原命令会误判为重复,不符合需求。
内容的提问来源于stack exchange,提问作者Liam McCartney
相关产品推荐
相关产品推荐

