1. 程式人生 > 其它 >Shell 統計每個單詞出現的個數

Shell 統計每個單詞出現的個數

目錄

Shell 統計每個單詞出現的個數

題目

寫一個 bash指令碼以統計一個文字檔案 nowcoder.txt 中每個單詞出現的個數。

為了簡單起見,你可以假設:
nowcoder.txt只包括小寫字母和空格。
每個單詞只由小寫字母組成。
單詞間由一個或多個空格字元分隔。

示例:
假設 nowcoder.txt 內容如下:
welcome nowcoder
welcome to nowcoder
nowcoder
你的指令碼應當輸出(以詞頻升序排列):
to 1
welcome 2
nowcoder 3

說明:
不要擔心個數相同的單詞的排序問題,每個單詞出現的個數都是唯一的。

題解

之前學習的命令都是以一行為處理物件,awk是可以對一行的某個欄位進行處理

先把每個欄位分割出來,每個欄位打印出來成一行,用uniq顯示一個並統計詞頻,但是注意使用uniq前需要排序,因為unqi只會將挨著的重複行刪除

[ranan@MPI1 ~]$ cat nowcoder.txt | awk '{for(i=1;i<=NF;i++){print $i}}' | sort | uniq -c
      3 nowcoder
      1 to
      2 welcome

接下來的處理是需要以詞頻升序sort,並且交換輸出的順序,這裡又牽扯到對欄位進行處理,使用awk

[ranan@MPI1 ~]$ cat nowcoder.txt | awk '{for(i=1;i<=NF;i++){print $i}}' | sort | uniq -c | sort -n | awk '{print $2,$1}'
to 1
welcome 2
nowcoder 3

關於把各個欄位單獨放在一行還有其他的處理辦法

  • tr
  • xargs

tr

xargs

學習

在評論區學到的寫法,太厲害了

感覺像雜湊表的寫法,一個欄位一個字元進雜湊表。

awk '{
 for (i = 1; i <= NF; ++i)
     mp[$i]++;
}
END {
 for (k in mp)
     print(k, mp[k]); #print輸出會換行
}' | sort -n -k2