【LeetCode】bash統計詞頻率——awk、sort

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

3.sort用法:https://www.runoob.com/linux/linux-comm-sort.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章