Posted on 2012-09-05 17:49
C小加 閱讀(3608)
評論(1) 編輯 收藏 引用 所屬分類:
Linux
寫一個文本處理程序,查找文本中n個出現頻率最高的單詞,輸出的結果需要顯示這些單詞出現的次數,并按照次數從大到小排序。
把問題分成六個步驟:
1,將文本以一行一個單詞的形式顯示出來
2,將大寫字母轉換成小寫
3,對單詞進行排序
4,對排序好的單詞列表統計每個單詞出現的次數
5,按照出現的次數排序
6,顯示單詞列表的前n行
腳本的代碼如下:
#topn.sh腳本
#!/bin/bash
end=$1 #1
cat $2 | #2
tr -cs "[a-z][A-Z]" "[\012*]" | #3
tr A-Z a-z | #4
sort | #5
uniq -c | #6
sort -k1nr -k2 | #7
head -n"$end" #8
#1:$1為第一個參數,表示輸出頻率最高的行數
#2:$2為第二個參數,表示目標文本,使用cat把目標文本輸入管道,|為管道符
#3:tr命令的-c選項用于選定不在”[a-z][A-Z]”字符集內的字符,tr命令將選定的字符轉換成換行符,\012是換行符的八進制碼,*表示將換行符任意擴展,使其等于被替換的字符集個數,這樣就將所有非字母的符號轉換為換行符,從而將文本文件以一行一個單詞的形式顯示出來。-s刪除所有重復出現的字符序列,只保留一個。最后把得到的結果輸入管道。
#4:tr把大寫字母轉化成小寫字母
#5:把分好的單詞進行排序
#6:uniq對排序好的單詞列表統計每個單詞出現的次數,并刪除相鄰重復行,-c 在輸出行前面加上每行在輸入文件中出現的次數。 這樣就得到了出現的頻率及其對應的單詞。
#7:用sort按照出現的頻率從大大小排序,頻率相同的按照字母排序。-k1表示按照第一域進行排序,-k2為按照第二域進行排序,先按照第一域排序如果第一域相等再按照第二域排序,-n表示數字,-r表示從大到小排序
#8:head 輸出前n行
輸出結果:
root@lNotebook-PC:/home/lwx/myshelltest# ./topn.sh 5 test .txt
13 qwe
12 qw
11 eqw
8 sdf
7 we