leetcode題目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 實現嗎?
ANS:
- 整理文本內容,使得每個單詞占一行
sed 's/ /\n/g' #將所有的空格換成換行
sed '/^$/d' #刪除所有空行
或者
tr -s ' ' '\n' #空格換行并清除空行
-
sort | uniq -c
統計單詞重復的次數 - 排序
sort -n 將字符串轉數字
sort -r 指定順序為從大到小
sort -k 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。
最后的命令可以是
cat words.txt | sed 's/ /\n/g' | sed '/^$/d' | sort | uniq -c | awk '{print $2, $1}' | sort -nrk2
# 或者
cat words.txt | tr -s ' ' '\n' | sort | uniq -c | awk '{print $2, $1}' | sort -nrk2