寫一個 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}'