2016-10-09 46 views
1

我有一個8列的文件,使用「|」作爲分隔符,我想計算第8列中詞語的出現頻率。我試過這樣的awkbash中文件列的頻率計數

awk -F '{print $8}' | sort | uniq -c $FILE 

但我得到的是整個文件的打印,我不明白我做錯了什麼。

編輯:現在我得到打印的內容我想如下:
2307的Internet Explorer
369 Safari瀏覽器
2785鉻
316歌劇
4182火狐
但我不明白的地方這「1」 來自

回答

2

您只需awk做到這一點:

awk -F '|' '{freq[$8]++} END{for (i in freq) print freq[i], i}' file 

此AWK命令使用|作爲分隔符,並使用與密鑰作爲$8陣列seen。當它發現一個密鑰$8增加頻率(值)1。 順便說一句,你需要在你的命令添加自定義分隔符|和使用它像這樣:

awk -F '|' '{print $8}' file | sort | uniq -c 
+0

此打印我的不同列表中的事件,但我也想要它們出現在列中的次數。 – JimS

+0

確定你可以看到'awk -F'|' '{print $ 2}'文​​件|排序| uniq -c「。 – anubhava

+0

是的,我發現我的錯誤順序管道。非常感謝你! – JimS

3

別的不說,你正在運行uniq$FILE,而不是上運行$FILEawk和管道的結果進行排序,然後uniq的。你的意思是寫:

awk -F'|' '{print $8}' "$FILE" | sort | uniq -c 

但所有你需要的是一個命令:

awk -F'|' '{cnt[$8]++} END{for (key in cnt) print cnt[key], key}' "$FILE" 

WRT I can't understand where this "1" come from - 你在輸入文件中有1空$ 8,也許是空白行。你可以找到它:

awk -F'|' '$8~/^[[:space:]]*$/{print NR, "$0=<"$0">, $8=<"$8">"}' "$FILE" 
+1

aahh yes這是你說的第一件事。錯誤的管道訂單。現在一切都好。非常感謝你! – JimS

+0

你對從複製粘貼的多餘行再次感謝你! – JimS

+0

不客氣。請閱讀[http://stackoverflow.com/help/someone-answers]瞭解下一步該做什麼。 –

0

一個cut基於答案,(加sed的位用引號括項目,將更好地使空行可見):

cut -d'|' -f8 "$FILE" | sed 's/.*/"&"/' | sort | uniq -c