为何uniq -c命令返回重复值?grep筛选后仍出现该问题
让我来帮你理清这个问题~
核心问题拆解
你遇到的uniq返回重复值的情况,其实是grep匹配逻辑和uniq特性共同作用的结果,咱们一步步说:
1. 先搞懂你的grep命令参数逻辑
你用的命令:
grep -v -w -i -r -f "dont_use_words.txt" "list_of_words.txt" >> inverse_match_words.txt
这里几个关键参数的影响:
-w:只匹配完整独立的单词,比如AAA只会匹配单独的AAA行,不会匹配GIRLAAA、AAABOY这种包含AAA但不是完整单词的字符串,所以这些行都会被保留到结果文件里-i:忽略大小写匹配- 你提到的
grep -F "AAA"是固定字符串匹配(非正则),不加-w的话,只要行里包含AAA就会被匹配过滤,这和-w的匹配范围完全不同,这也是你疑惑的两种场景差异的根源
2. 为什么uniq -c -i还会有重复?
uniq的核心特性是:它只能合并连续出现的重复行,哪怕加了-i忽略大小写,如果重复行不是挨着的,它就识别不出来!
举个例子,如果你的inverse_match_words.txt内容是:
GIRLAAA AAABOY GIRLAAA
直接跑uniq -c -i会输出:
1 GIRLAAA 1 AAABOY 1 GIRLAAA
因为GIRLAAA不是连续出现的,uniq没法合并它们。
解决方案
根据你的需求,分两种场景调整:
场景一:想过滤所有包含禁用词的行(不管是不是完整单词)
调整grep命令,去掉-w,加上-F确保是固定字符串匹配(避免正则干扰),同时用>覆盖写入(避免多次执行追加旧内容):
grep -v -i -F -f "dont_use_words.txt" "list_of_words.txt" > inverse_match_words.txt
然后统计时,先排序让重复行连续,再用uniq:
sort -f inverse_match_words.txt | uniq -c -i | sort -nr
sort -f是忽略大小写排序,保证相同内容的行排在一起,uniq就能正确合并计数。
场景二:只想过滤完整单词匹配的行(保留包含禁用词但非完整单词的行)
保留-w参数,但同样要先排序再用uniq:
grep -v -w -i -F -f "dont_use_words.txt" "list_of_words.txt" > inverse_match_words.txt sort -f inverse_match_words.txt | uniq -c -i | sort -nr
额外小提示
- 可以先不加输出重定向,直接运行grep命令查看输出,确认哪些行被保留,方便调试匹配逻辑
- 你的命令里
-r是递归查找,这里只处理单个文件list_of_words.txt,去掉-r会更高效
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

