题目描述:写一个 bash 脚本以统计一个文本文件 words.txt
中每个单词出现的频率。
为了简单起见,你可以假设:
words.txt
只包括小写字母和' '
。- 每个单词只由小写字母组成。
- 单词间由一个或多个空格字符分隔。
示例:
假设
words.txt
内容如下:the day is sunny the the the sunny is is
你的脚本应当输出(以词频降序排列):
the 4 is 3 sunny 2 day 1
说明:
- 不要担心词频相同的单词的排序问题,每个单词出现的频率都是唯一的。
- 你可以使用一行 Unix pipes 实现吗?
解法1。
- cat words.txt:cat命令是linux下的一个文本输出命令,通常是用于观看某个文件的内容的
- tr -s ' ' '\n':把空格全部转换成换行,并对多个换行只保留1个换行
- sort:对上游传过来的文件内容进行排序,就是把相同字符放到一起了而不是分散着
- uniq -c:uniq是去重复命令,此处是局部去重并计算每行出现的次数。通常与sort合在一起使用达到全局去重并计数的目的
- sort -rn:逆序排序并按照数字排序(第一列频数)
- awk '{print $2, $1}':
- awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息
- awk处理过程: 依次对每一行进行处理,然后输出
- 这里是打印每行第2个字段、第1个字段,因为上述过程中sort | uniq -c这一步的结果第一列为频数,第二列为字符
# Read from the file words.txt and output the word frequency list to stdout.
cat words.txt | tr -s ' ' '\n' | sort | uniq -c | sort -rn | awk '{print $2, $1}'