如何使用awk实现仅当重复次数超过指定次数时移除重复行
解决awk仅移除重复次数超过两次的行的需求
哇,这个需求有点意思!从你的例子来看,你想要的是完全移除所有出现次数超过两次的行(也就是这类行一次都不保留),而保留那些出现次数≤2的所有行——比如apple出现了3次,就全部删掉;banana出现2次,就都留下。对吧?
如果是这样的话,我们需要分两步来做:先统计每一行的总出现次数,然后再遍历文件,只输出那些总次数不超过2的行。用awk可以轻松实现,只需要两次扫描文件就行:
awk 'NR==FNR {count[$0]++; next} count[$0] <= 2' myfile.txt myfile.txt
给你拆解一下这个命令的逻辑:
- 第一次处理文件(
NR==FNR这个条件成立时,NR是全局行号,FNR是当前文件的行号,第一次处理两者相等):我们用count[$0]++统计每行的出现次数,next跳过后续逻辑,直接处理下一行。 - 第二次处理文件时,仅打印那些
count[$0] ≤ 2的行——这样就把所有出现次数超过2的行彻底过滤掉了。
拿你的测试输入验证:
输入行依次是:
apple
apple
banana
apple
pear
banana
cherry
第一次统计后,count["apple"]=3,count["banana"]=2,count["pear"]=1,count["cherry"]=1。第二次扫描时,只有banana、pear、banana、cherry满足条件,输出正好是你想要的结果。
如果你的需求其实是保留前两次出现的行,删除第三次及以后的(比如保留前两个apple,删掉第三个),那命令会更简洁:
awk 'count[$0]++ < 2' myfile.txt
这个逻辑是每次处理行时,先检查当前计数是否小于2,是的话就打印,然后计数加1。这样前两次出现的行会被保留,第三次及以后的就被过滤。不过看你的例子输出里没有apple,所以第一种方案应该更贴合你的需求~
内容的提问来源于stack exchange,提问作者Michael Gauthier
相关产品推荐
相关产品推荐

