歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux排重的方法

Linux排重的方法

日期:2017/2/28 15:42:21   编辑:Linux教程

想必各位用linux的人都會碰到排重的問題,像查看一個日志文件,碰到很多重復記錄,看起來很痛苦。還有像grep一下關鍵字,想找出現關鍵字的文件,但是出現了一堆重復的文件名,也是一件郁悶的事情。 下面給大家介紹兩種linux排重的方法,一種是使用uniq命令,一種使用gawk。

uniq排重

uniq的作用是對相鄰重復行進行排重處理,對無序的字符是沒辦法處理,所以需要配合sort一起使用。

下面舉個例子,test.txt 的具體內容如下:

www.linuxidc.com @linux:~/tmp$ cat test.txt
aa
bb
aa
cc
bb

排重可以通過命令:

www.linuxidc.com @linux:~/tmp$ cat test.txt | sort | uniq
aa
bb
cc

如果需要獲取每條重復記錄的出現的次數,可以使用-c選項:

www.linuxidc.com @linux:~/tmp$ cat test.txt | sort | uniq -c
2 aa
2 bb
1 cc

gawk排重:

使用gawk排重的話,原理是用一個數組的索引來存儲每行記錄,數組的值可以存放出現次數。

www.linuxidc.com @linux:~/tmp$ cat test.txt | gawk '{a[$1]++}; END {for (b in a) print a[b], b}'
2 bb
1 cc
2 aa

{a[$1]++}; 這一行的作用是使用一個a數組,他的索引是記錄的第一列,就是這裡的aa、bb、cc。“{}”號前面沒有作用域,對每條記錄都生效。

END {for (b in a) print a[b], b} 這一行是在遍歷後記錄後,遍歷數組a,打印結果。

uniq跟gawk都能用來進行排重處理,uniq使用起來應該比較方便,記住uniq跟sort命令就行。但是就效率來說uniq的效率比gawk差多了,因為使用uniq之前要進行排序,最好的情況是n*log(n)復雜度,而使gawk只需要遍歷一遍,也就是n的復雜度。所以這裡跟大家建議,對於小文件,可以使用sort + uniq進行排重處理,但是對於大文件,使用gawk會給你節省不少時間。

Copyright © Linux教程網 All Rights Reserved