shell之词频统计

写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率。
为了简单起见,你可以假设:
words.txt只包括小写字母和 ' ' 。
每个单词只由小写字母组成。
单词间由一个或多个空格字符分隔。
示例:
假设 words.txt 内容如下:
the day is sunny the the the
the sunny is is
你的脚本应当输出(以词频降序排列):
the 4
is 3
sunny 2
day 1
说明:
你可以使用一行 Unix pipes 实现吗?

思考: 1、需要把文件里的单词都变成一列,然后进行统计。
2、用循环语句对每个单词进行统计,相同的即+1

方法一:tr获取单词
cat words.txt |tr -cs "[a-z][A-Z]" "\n" |tr A-Z a-z |sort|uniq -c|sort -r|awk '{print $2,$1}'

tr 命令:tr是transform的缩写,该命令是著名的流处理命令sed的简化版,也是用来对文档进行转换的。tr -cs “[a-z][A-Z]" "\n" -c表示取“[a-z][A-Z]"的补集(complement),-s 表示把连续的匹配压缩成一个”\n“,所以整个命令就是把除了字母外的其他字符一律压缩成换行符,如果有连续的匹配,则只转换成一个换行符。
tr A-Z a-z 把大写统一转换成小写。
sort 排序 按字母顺序
uniq 去重 该命令必须对排序好的文档进行,-c 表示打印出字母的重复次数
然后再次 sort -r ,反向排序,-n正向排序;这次sort比较复杂,因为在uniq命令后 输出结果已经变成了 如下形式:
n word (单词的重复次数+空格+单词)
awk '{print $2,$1}' 替换下n word的位置

方法二、awk功能
egrep -o "\b[[:alpha:]]+\b" words.txt| awk '{count[$0]++}END{for(ind in count){printf("%-14s%d\n",ind,count[ind]);}}' |sort -k2 -r

相关链接:
https://www.cnblogs.com/ggbond1988/p/4812527.html
https://blog.csdn.net/weixin_38336658/article/details/82258031
http://tieba.baidu.com/p/2530450657

转载于:https://blog.51cto.com/9030540/2319414

你可能感兴趣的:(shell之词频统计)