想必各位用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会给你节省不少时间。