给定一个文本文件,我想输出文件中的单词及其频率。例如,如果文本文件包含“我真的很喜欢汉堡”,则输出应如下所示:
Burgers 1
I 1
Love 1
Really 2
答案1
测试文件:
$ cat filename.txt
I really really love burgers
cat filename.txt \
| tr -s ' ' '\n' \
| sort \
| uniq -c \
| sort -n -r \
| awk '{ print $2 " " $1 }'
输出:
really 2
love 1
I 1
burgers 1
让我们分解所有这些并解释每个步骤。首先,文件由cat
to打印出来stdout
。
cat fileanme.txt
然后我们将输出传递给cat
它,它将用换行符tr
()替换所有空格( )。该选项压缩空格并将多个空格替换为一个。即使在单词之间有多个空格,这也会每行生成一个单词。' '
'\n'
-s
tr
'\n'
tr -s ' ' '\n'
我们传递给的单词列表sort
。这将按字母顺序对单词进行排序。
sort
可以将排序的单词列表传递给uniq
它将输出唯一的单词列表。uniq
需要对列表进行排序。-c
标志输出还在每个字之前进行计数。计数器在每行的开头保留了几个空格。这会产生对齐的单词。这些空格将在下一步中删除。
uniq -c
现在我们可以按计数器对单词进行排序。-n
导致sort
使用每行(计数器)中的第一个单词进行数字排序。-r
选项反转结果(最高计数器优先)。
sort -n -r
最后awk
,使用print
,对于所有行,我们交换单词和计数器。多余的空格被免费清除(awk
使用空格作为字段分隔符,折叠多个空格)。
对于每一行我们print
:
$2
第二个字段(字)" "
- 单一空间$1
- 柜台
awk '{ print $2 " " $1 }'