我正在尝试使用Bash搜索文本文件,并且仅报告少于X次的单词。我尝试过了
cat abcd.txt | tr " " "\n" | sort | uniq -c
但是它会报告所有单词及其计数。另外,它还将标点符号与单词混合在一起。例如,如果在单词“ day”后加上“。”,则会报告“ day”。
答案 0 :(得分:2)
如果可以使用Python,则可以使用以下脚本:
import sys # for argument access
from collections import Counter
from string import punctuation
c = Counter()
if __name__ == "__main__":
with open(sys.argv[1]) as f:
for line in f:
words = [word.strip(punctuation) for word in line.split()]
c += Counter(words)
print('\n'.join([k for k, v in c.items() if v < int(sys.argv[2])]))
并用于:
$ python thisscript.py targetfilepath <COUNT>
其中<COUNT>
是您有兴趣限制的出现次数。
答案 1 :(得分:2)
使用awk:
awk -F'[^a-zA-Z0-9]+' -v MAX=1 '{for(i=1;i<=NF;i++) a[$i]++}END{a[""]=MAX+1;for(k in a) if(a[k]<=MAX) print k}' file.txt | sort
字段分隔符排除了不是ASCII字母或数字[^a-zA-Z0-9]
的所有字符(可以自由选择要视为单词一部分的字符)。
-v MAX=1
开关定义一个单词的最大允许出现次数。
每个单词都存储在一个关联数组中,键是单词本身,值是出现次数。
一旦解析了所有文件,END{}
部分就会显示单词(出现次数少于或等于MAX
)。