192. 統計詞頻

寫一個 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、sort語法複習 
      sort -n 將字符串轉數字 
      sort -r 指定順序爲從大到小 
      sort -k 2 指定第二個字段作爲排序判斷標準

  tr -s ' ' '\n' 是將所有連續的空格 空行刪除並保證每一行只有一個字符串 
  sort | uniq -c 通常一起用來統計重複出現的次數。

cat words.txt | tr -s ' ' '\n' | sort | uniq -c | sort -rn | awk '{print $2, $1}'

2、 awk 是逐行檢索文本。分爲3的部分。 
BEGIN{#這裏進行一些檢索文本前的初始化操作} 
{#這裏是對應每一行的操作}

例如這裏 for(i=1;i<=NF;++i){++m[$i]}就是將每一行分隔的字段,進行詞頻統計。 
NF是分隔的字段數。 
$0表示整行字符串 
$1到$NF表示從分隔的第一個字符串到最後一個字符串 
awk中的數組可以用作hashtable做來詞頻統計。 
END{#在檢索文本後的操作} 
for(k in m) k表示的就是m的key。

awk -F' ' '{for(i=1;i<=NF;i=i+1){print $i}}' words.txt|sort|uniq -c|sort -nr|awk -F ' ' '{printf("%s %s\n", $2, $1)}'

 

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