bash統(tǒng)計詞頻

leetcode題目192.統(tǒng)計詞頻
寫一個 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 實(shí)現(xiàn)嗎?
    ANS:
  1. 整理文本內(nèi)容,使得每個單詞占一行
sed 's/ /\n/g' #將所有的空格換成換行
sed '/^$/d' #刪除所有空行

或者

tr -s ' ' '\n' #空格換行并清除空行 
  1. sort | uniq -c 統(tǒng)計單詞重復(fù)的次數(shù)
  2. 排序
sort -n 將字符串轉(zhuǎn)數(shù)字 
sort -r 指定順序?yàn)閺拇蟮叫?
sort -k 2 指定第二個字段作為排序判斷標(biāo)準(zhǔn)
  1. 輸出
awk 是逐行檢索文本。分為3的部分。 
BEGIN{#這里進(jìn)行一些檢索文本前的初始化操作} 
{#這里是對應(yīng)每一行的操作}。例如這里 for(i=1;i<=NF;++i){++m[$i]}就是將每一行分隔的字段,進(jìn)行詞頻統(tǒng)計。 
NF是分隔的字段數(shù)。 
$0表示整行字符串 
$1到$NF表示從分隔的第一個字符串到最后一個字符串 
awk中的數(shù)組可以用作hashtable做來詞頻統(tǒng)計。 
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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容