LeetCode地址:統計詞頻,bash
題目描述:
寫一個 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
解題:
參考大神高斯恍惚的解題,地址這裏。
cat words.txt |
awk '{
for(i=1;i<=NF;i++){
count[$i]++
}
} END {
for(k in count){
print k" "count[k]
}
}' |
sort -rnk 2
下面來解讀下這個腳本中的關鍵內容:
cat:顯示文件內容
|:管道,將左邊的輸出作爲右邊的輸入
awk: 是一種處理文本文件的語言,是一個強大的文本分析工具。
AWK 工作流程可分爲三個部分:
- 讀輸入文件之前執行的代碼段(由BEGIN關鍵字標識)。
- 主循環執行輸入文件的代碼段。
- 讀輸入文件之後的代碼段(由END關鍵字標識)。
例子:程序開始執行時,AWK 在開始塊中輸出表頭信息。在主體塊中,AWK 每讀入一行就將讀入的內容輸出至標準輸出流中,一直到整個文件被全部讀入爲止。
marks.txt中內容:
1) 張三 語文 80
2) 李四 數學 90
3) 王五 英語 87
$ awk 'BEGIN{printf "序號\t名字\t課程\t分數\n"} {print}' marks.txt
輸出結果:
序號 名字 課程 分數
1) 張三 語文 80
2) 李四 數學 90
3) 王五 英語 87
count[$1] :將記錄按指定的域分隔符劃分域,填充域,$0 則表示所有域(即一行內容),$1 表示第一個域,$n 表示第 n 個域。所以腳本中從1開始,進行單詞統計。
sort:用於將文本文件內容加以排序。
可針對文本文件的內容,以行爲單位來排序。sort 命令將以默認的方式將文本文件的第一列以ASCII 碼的次序排列,並將結果輸出到標準輸出。
語法
sort [-bcdfimMnr][-o<輸出文件>][-t<分隔字符>][+<起始欄位>-<結束欄位>][--help][--verison][文件]
參數說明:
-n 依照數值的大小排序。
-r 以相反的順序來排序。
-k:表示多字段排序,2表示以第二列爲關鍵字進行排序。
其他:
- grep 適合單純的查找或匹配文本
- sed 適合編輯匹配到的文本
- awk 適合格式化文本,對文本進行較複雜格式處理
1.awk用法例子:https://www.runoob.com/linux/linux-comm-awk.html
2.awk工作原理:https://www.runoob.com/w3cnote/awk-work-principle.html