![我想单独计算文本文件中存在的所有单词及其出现次数](https://linux22.com/image/182076/%E6%88%91%E6%83%B3%E5%8D%95%E7%8B%AC%E8%AE%A1%E7%AE%97%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E5%AD%98%E5%9C%A8%E7%9A%84%E6%89%80%E6%9C%89%E5%8D%95%E8%AF%8D%E5%8F%8A%E5%85%B6%E5%87%BA%E7%8E%B0%E6%AC%A1%E6%95%B0.png)
我有一个文件:file.txt
包含以下内容:
I am groot, groot me, me groot,I love groot, groot groot, am I groot groot so
我想单独计算所有单词。
我使用命令进行单字计数:
tr ' ' '\n' < file.txt | grep "groot" | wc -l
但我想知道有没有办法把所有单词都数一遍?所需的输出如下所示:
word count
I 4
am 3
groot 8
me 2
可以使用一些 bash 文件或 bash 脚本来完成吗?请帮忙。
答案1
grep -o '\w\+' file.txt | sort | uniq -c
解释:
grep -o
将在单独的行上输出每个匹配项。\w\+
匹配任何连续的字母数字字符 和_
。uniq -c
将输出每次连续运行的重复行的出现次数。- 为了将每个唯一单词分组到单次连续的重复行中,
sort
before是必需的。uniq -c
答案2
仅使用标准工具:
$ tr -sc '[:alpha:]' '\n' <file | sort | uniq -c
3 I
2 am
8 groot
1 love
2 me
1 so
首先用换行符替换每个非单词字符。我们将非单词字符定义为“任何不是字母字符的字符”(这就是在命令行中-c
与[:alpha:]
和一起执行的操作)。由此产生的任何超过一个连续换行符的运行都会被压缩为单个换行符(这就是命令行上的操作)。\n
tr
-s
tr
然后对生成的单词(每行一个单词)进行排序sort
,然后计算每个单词出现的次数。
sort | uniq -c
使用单个程序可以使管道部分的时间效率稍微提高一些awk
:
$ tr -sc '[:alpha:]' '\n' <file | awk '{ count[$0]++ } END { for (word in count) print count[word], word }'
1 love
8 groot
2 am
3 I
1 so
2 me
该awk
代码只是使用读取的每个单词tr
作为关联数组的键count
,并在每次看到该单词时递增关联值。最后,代码打印所有单词的计数。