查找出现少于X次的每个单词

时间:2018-07-09 21:22:54

标签: regex

我正在尝试使用Bash搜索文本文件,并且仅报告少于X次的单词。我尝试过了

cat abcd.txt | tr " " "\n" | sort | uniq -c

但是它会报告所有单词及其计数。另外,它还将标点符号与单词混合在一起。例如,如果在单词“ day”后加上“。”,则会报告“ day”。

2 个答案:

答案 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)。