Shell程式設計:統計一個檔案中的詞頻

2020-08-07 21:47:39
寫一個 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 實現嗎?

方法一:

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

cat --瀏覽檔案
tr -s 替換字串
sort 字典排序
uniq -c 去重並輸出次數,c爲次數
sort -r 反向排序
awk 格式化輸出兩列

方法二:將其中的"tr" 命令替換成xargs -n1

cat words.txt |xargs -n1|sort|uniq -c |sort -r|awk '{print $2" "$1}'

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/word-frequency

方法三:使用awk統計單詞,並排序輸出

第一步:將檔案單詞進行每行一個輸出(使用xargs命令)(此處可以不用,也可以使用awk指令碼NF處理)
第二步:使用awk陣列進行統計(陣列+MAP概念),並輸出
第三步:將輸出元素進行倒序排序 + 輸出位置調整 (sort+awk)

cat words.txt | xargs -n 1 | awk '{
    if($1 in data)
        data[$1] = data[$1] + 1
    else
        data[$1] = 1
 } END {for(str in data) print data[str],str}' | sort -rn | awk '{print $2, $1}'