Shell 統計每個單詞出現的個數
阿新 • • 發佈:2021-12-09
目錄
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