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