2012-06-23 53 views
3

摘要:有沒有辦法從文件中獲得唯一的行數和出現次數比使用sort | uniq -c | sort -n更有效?高效排序| uniq爲大量副本的情況下

詳細:我經常管sort | uniq -c | sort -n做日誌分析時,得到其日誌條目的一般趨勢顯示最多/最少等這個工程的大部分時間 - 當我處理一個非常不同的大型日誌文件,最終導致大量的重複文件(在這種情況下,sort | uniq -c最終需要很長時間)。

示例:我現在面臨的具體情況是爲了從'未參數化'的mysql bin日誌獲取趨勢,以確定哪些查詢運行得最多。對於通過grep/sed組合來移除參數的一百萬個條目的文件 - 導致大約150條獨特的行 - 我花了大約3秒鐘的時間查看sedding和大約15秒的排序/統一。

目前,我已經解決了一個簡單的C++程序,它保留了<行的地圖,count> - 它在不到一秒的時間內完成了任務 - 但我想知道現有的實用程序是否已經存在。

+0

等待,直到你的C++程序運行內存不足:-D – 2012-06-24 01:25:34

+0

爲什麼會使用地圖存儲出現的次數使用更多的內存比排序每次出現(即排序中的第一個排序| uniq -c | sort -n序列)? –

+1

[GNU'sort'](http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html)將使用臨時文件來保存太大而無法一次裝入內存的數據。 – ephemient

回答

5

我不確定會有什麼樣的性能差異,但是您可以用簡單的awk腳本替換sort | uniq -c。既然你有很多重複和雜湊的,而不是排序,我會想象它的速度更快:

awk '{c[$0]++}END{for(l in c){print c[l], l}}' input.txt | sort -n 
+0

謝謝,這對於有大量愚蠢的文件非常適合。 (Mac OSX Lion和RHEL 4)有一個非常老的版本(5.x) 比較性能和coreutils 8.x(在Ubuntu 12.04上測試)沒有問題,排序,uniq,排序鏈就像一個魅力。 –

+1

coreutils 5.x和8.x之間的比較感興趣的人:[link](https://gist.github.com/2981363) –

+0

如果你有一個很大的文件目錄你想排序和uniq使用這個腳本,你可以像這樣運行它: 'awk'{c [$ 0] ++} END {for(l in c){print c [l],l}} <(find。-type f | xargs貓)| sort -n' – omribahumi