想必各位用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會給你節省不少時間。