前幾天碰到一個問題:現在有一萬多條記錄,其中包含重復的記錄,每條記錄占一行,問如何從這些記錄中找到數量排名前10的記錄?
對於這個問題,可以編程實現。但是在Linux環境下,可以簡單的通過一些命令的組合直接完成這項工作。這裡先講我使用的命令,再一一分析。
可以使用以下命令完成這個任務,其中所有的記錄以每條一行的形式存儲在data文件中。
Linux代碼
$ sort data | uniq -c | sort -k 1 -n -r | head 10
$ sort data | uniq -c | sort -k 1 -n -r | head 10
現在來一一分析這些命令組合的含義。
1) sort data
表示對data文件中的內容進行排序。sort命令是對於每一行的內容根據字典序(ASCII碼)進行排序,這樣可以保證重復的記錄時相鄰的。
2) sort data | uniq -c
這裡,通過管道(|)將左邊部分的命令的輸出作為右邊部分的輸入。uniq -c 表示合並相鄰的重復記錄,並統計重復數。因為uniq -c 只會合並相鄰的記錄,所以在使用該命令之前需要先排序。
3) sort data | uniq -c | sort -k 1 -n -r
經過uniq -c 處理之後的數據格式形如"2 data",第一個字段是數字,表示重復的記錄數;www.linuxidc.com第二個字段為記錄的內容。我們將對此內容進行排序。sort -k 1表示對於每行的第一個字段進行排序,這裡即指代表重復記錄數的那個字段。因為sort命令的默認排序是按照ASCII,這就會導致按從大到小進行排序時,數值2會排在數值11的前面,所以需要使用-n 參數指定sort命令按照數值大小進行排序。-r 表示逆序,即按照從大到小的順序進行排序。
4) sort data | uniq -c | sort -k 1 -n -r | head 10
head 命令表示選取文本的前x行。通過head 10 就可以得到排序結果中前十行的內容。
總結:通過這個例子,可以深刻的體會到Linux的命令工具集的強大之處,通過幾個命令的組合便可以完成這樣一件常見但又不簡單的任務,體現了Linux簡潔而優美的特點。