首页 > 系统服务 > 详细

shell之词频统计

时间:2018-11-20 19:01:12      阅读:203      评论:0      收藏:0      [点我收藏+]
写一个 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

shell之词频统计

原文:http://blog.51cto.com/9030540/2319414

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!