題目描述
寫一個 bash 腳本以統(tǒng)計一個文本文件 words.txt 中每個單詞出現(xiàn)的頻率酪捡。
為了簡單起見,你可以假設(shè):
words.txt只包括小寫字母和 ' ' 。
每個單詞只由小寫字母組成呢袱。
單詞間由一個或多個空格字符分隔。
示例:
假設(shè) words.txt 內(nèi)容如下:
the day is sunny the the
the sunny is is
你的腳本應(yīng)當(dāng)輸出(以詞頻降序排列):
the 4
is 3
sunny 2
day 1
說明:
不要擔(dān)心詞頻相同的單詞的排序問題坯临,每個單詞出現(xiàn)的頻率都是唯一的液肌。
你可以使用一行 Unix pipes 實現(xiàn)嗎嗦哆?
分析
使用awk命令做統(tǒng)計
awk命令說明:
awk程序的結(jié)構(gòu):
每個awk程序都是一個或多個模式-動作語句的序列:
pattern { action }
pattern { action }
...
模式匹配粥喜,則執(zhí)行動作
常見模式有:
BEGIN, END,/正則表達式/,表達式
統(tǒng)計的action, 模式省略:
{for(i=1;i <= $NF; i++){++m[$i]}}
說明:
NF是分隔的字段數(shù)目
1-$NF表示分隔的第一個到最后一個字符串
m是hash表
輸出結(jié)果的模式-動作:
END {for(k in m){print k, m[k]}}
END是讀取到結(jié)束的模式
for(k in m)
k是數(shù)組的key
最后需要對結(jié)果進行排序,使用
|sort -nrk 2
-n表示按數(shù)值排序
-r表示逆序
-k 2表示按第二個字段排序
代碼
# Read from the file words.txt and output the word frequency list to stdout.
awk '{for(i=1;i<= NF;i++) {++m[$i]}} END{for(k in m){ print k,m[k]}}' words.txt | sort -rnk 2
題目鏈接
https://leetcode-cn.com/problems/word-frequency/description/