2017-09-14 50 views
-1

我有文字那樣的日誌文件:如何使用bash腳本提取並計算文件中出現的不同短語?

"Blablabla" [texttext] "text" 148 228 "blabla" "phrase 1" 
    "Blablabla" [texttext] "text" 220 211 "blabla" "phrase 1" 
    "Blablabla" [texttext] "text" 148 215 "blabla" "phrase 2" 
    "Blablabla" [texttext] "text" 220 245 "blabla" "phrase 3" 
    "Blablabla" [texttext] "text" 200 - "blabla" "phrase 4" 
    "Blablabla" [texttext] "text" 148 200 "blabla" "phrase 4" 

,我需要編寫腳本,將只需要線,第一個數字2 **然後提取「單詞或短語」,並把他們的數量和比例在另一文件。

我想用類似的東西

cat log.txt | grep '" 2..' > to something 

但我想不出什麼高度重視和我用 - 用sed,awk的或其他任何東西。另外我想,我需要使用bash數組。但是,如何使用循環來查找 - 是否已經存在或不存在?

感謝您的任何幫助。

UPD。我需要看到像

1. Phrase 1 - 500 - 50% 
2. Phrase 2 - 340 - 34% 
3. Phrase 3 - 100 - 10% 
4. Phrase 4 - 60 - 6% 

是的,這是我的壞,我忘了。我只需要這些短語中的前10名。

+1

請提供預期的輸出。 – Aif

+0

以及「500」是如何計算的?輸出不清 – RomanPerekhrest

+0

文件有10000多行。 500次「短語1」與2 **一致。 – Mex

回答

1

假設你指的是第4欄和欄只有3位數字:

cat line_with_input | grep -E '.*\s.*\s.*\s2[0-9]{2}.*' | awk '{print $7" "$8}' | sort | uniq -c 

輸出你的情況:

2 "phrase 1" 
    1 "phrase 2" 
    1 "phrase 3" 
    2 "phrase 4" 

編輯:所以你不希望只是數不同的短語?

+0

不要這樣做,不會'awk'$ 4〜/.* 2。*/{print $ 7「」$ 8}'line_with_input'大大減少了這種情況嗎? :-)。而「你不只是想數......?」。同意。這是單獨的程序!祝你們好運。 – shellter

+0

不僅。我需要按整體比率/計數進行排序,並且只保存10行。這真的是我的錯,我忘了提及它。 – Mex

+0

@shellter,這不僅比我的解決方案更優雅,而且實際上正在做我想做的事(我的文章沒有按照我的意圖去做)。你能解釋一下awk語句究竟是如何工作的嗎? – PejoPhylo

1

對於你的問題的特定輸入數據:

$ cat file1 
    "Blablabla" [texttext] "text" 148 228 "blabla" "phrase 1" 
    "Blablabla" [texttext] "text" 220 211 "blabla" "phrase 1" 
    "Blablabla" [texttext] "text" 148 215 "blabla" "phrase 2" 
    "Blablabla" [texttext] "text" 220 245 "blabla" "phrase 3" 
    "Blablabla" [texttext] "text" 200 - "blabla" "phrase 4" 
    "Blablabla" [texttext] "text" 148 200 "blabla" "phrase 4" 

$ awk '$4~/2../{l++;a[$7FS$8]++}END{print "total phrases:" l; \ 
for (i in a) print i,"-", "Found:",a[i],"-","Ratio:",a[i]/l*100 "%"}' file1 

total phrases:3 
"phrase 1" - Found: 1 - Ratio: 33.3333% 
"phrase 3" - Found: 1 - Ratio: 33.3333% 
"phrase 4" - Found: 1 - Ratio: 33.3333% 

很顯然,在這個例子中總的短語是指線發現場4點開始與2

詞組爲了獲得前10名,一個簡單的方法是運行上面的代碼,然後排序使用+頭:

$ awk 'your awk code here' file |sort |head #Head without options returns the top 10 lines. 

PS:您需要調整排序選項,使基於比列或帕分揀ses count列(awk輸出)。

相關問題