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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章