2016-09-07 39 views
1

我需要使用bash命令在隨機文本中查找5個最流行的單詞。我試圖在cat,wc,uniq,sorttail之間做出不同的組合,但是達不到任何結果。要麼我的輸出將是一個單詞,或文本本身,或文本的字數......我應該缺少水漬...使用bash命令找到最流行的5個單詞

這是甚至可能與單線?我是否應該用「水平升高」來解決問題,如for-do

F.e.作爲輸入:this random text(我的數據有其他文本,但它們太大而無法在此處顯示),並輸出...以及5個最常用的詞(我不知道它們目前是哪些詞: D)。

+2

頭-5退出添加示例內容,並從你期望的輸出。 – heemayl

+0

sed's// \ n/g'test.txt | awk'max <++ c [$ 0] {max = c [$ 0]} END {for(i in c)printf「%s%s \ n」,c [i],i}' | sort -r |頭-5這將使用空間文件。用新行替換所有內容並計算uniq行數。我發現它的一部分在stackoverflow上。 – arseniyandru

回答

1
$ cat lorem.txt | tr \ '\n' | tr -c -d '[:alpha:]\n' | tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -nr | head -5 
    10 vitae 
    10 in 
     9 quis 
     9 nunc 
     9 eget 

步入式直通:

  • tr \ '\n'上單獨記錄
  • 單獨的單詞
  • tr -c -d '[:alpha:]\n'刪除非字母
  • tr '[:upper:]' '[:lower:]'轉換爲小寫
  • sort | uniq -c |sort -nr種類,數量和頻率順序 打印|五
+1

@lmo是的,我沒有留下評論,因爲它是對我註解的awk解決方案的重寫 - 再加上我睡着了。我的awk版本不那麼無聊,呃? –

+0

第一個'tr'後的'\'是否表示空格(空格)? – Milkncookiez

+0

@Milkncookiez有點晚了,但是。 –

3

awk是否計數?

BEGIN { 
    RS=FS         # separate words on separate records 
    PROCINFO["sorted_in"]="@val_num_desc" # set sort order to pick most frequent 
} 
{ 
    gsub(/[^a-zA-Z]/,"")     # remove non-letters 
    a[tolower($0)]++      # convert to lower case and count words 
} 
END { 
    for(i in a) {       # go thru array in frequency order 
     print i,a[i]      # print 
     if(++j==5); exit     # exit in five 
    } 
} 
$ awk -f this.awk lorem.txt 
vitae 10 
in 10 
quis 9 
eget 9 
nunc 9 
1
cat words | perl -pe 's/[\W+]/\n/g' | sort | uniq -c | sort -nr | head -n6 
111 
10 vel 
    8 ut 
    8 turpis 
    8 sit 
    8 erat 

排序-N 6,因爲它打印空白自頂1項

1

這個腳本使得vitaevitae?相等。也許你還想要小寫字母?
我認爲@Brown的awk解決方案是更好的,但你的命令的解決方案看起來像

sed 's/[^a-zA-Z]/ /g' loremIpsum.txt | 
    tr ' ' '\n' | grep . | sort | uniq -c | sort -rn | head -5 

     8 non 
     7 vitae 
     7 vestibulum 
     7 vel 
     7 purus