Linux中如何基于文件首列删除所有重复行且不保留任何重复项
解决方案
直接用awk两次遍历文件即可实现需求,命令如下:
awk 'NR==FNR{count[$1]++; next} count[$1] == 1' 你的文本文件路径 你的文本文件路径
命令逻辑说明
- 第一遍扫描文件时,仅统计第一列每个值出现的总次数,存入
count数组,不做输出 - 第二遍再次逐行扫描同一个文件,只有当当前行第一列的出现次数恰好为1时,才输出这一行;所有出现次数≥2的第一列对应的行,会被全部过滤掉,不会保留任何一条
为什么你之前用的命令不符合要求
awk '!seen[$1]++'的逻辑是:第一次遇到某个第一列值时输出,后续再遇到相同值就跳过,本质是为每个重复值保留第一条记录,和你“重复就全删”的需求不符sort -t'-' -k1,2n | uniq的逻辑是排序后把连续重复的行去重,默认也是为每个重复值保留一条记录,达不到全删的效果
效果验证
用你提供的样例输入执行上述命令,输出结果和你预期完全一致:
AX-172322243 2 AX-172322331 2 AX-172322354 2 AX-172322383 2 AX-172322440 2 AX-172322719 7
如果觉得写两次文件名麻烦,也可以用下面这个等效写法,不过可读性稍差:
awk '{cnt[$1]++} END{while((getline l < FILENAME)>0){split(l,a," "); if(cnt[a[1]]==1) print l}}' 你的文本文件路径
内容的提问来源于stack exchange,提问作者Paillou
相关产品推荐
相关产品推荐

