使用uniq命令求并集交集差集
原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。
uniq
uniq是linux上非常有用的一个命令,从字面意思上就能看出来,它可以用来去重。
但使用uniq的前提是文件是排好序的,所以我们经常会搭配sort排序命令来一起使用uniq,如下:
$ cat test.txt
c
a
a
b
$ sort test.txt | uniq
a
b
c
# sort -u 也能去重
$ sort -u test.txt
a
b
c
如上所示,由于sort -u
也能达到去重的效果,导致uniq的原本功能就显得不那么有用了。
其实经常会发现这样的linux命令,衍生功能比原始功能更有用,比如wc
命令,全名是word count,即单词计数,但我们最常用的却是wc -l
获取行数。
与wc
一样,uniq
的衍生功能也比原始去重功能要有用得多,如下:
分组计数uniq -c
$ sort test.txt | uniq -c
2 a
1 b
1 c
-c
选项可以统计每个值的个数,超级有用,还有下面这个按状态统计TCP连接数的。
$ netstat -nat|awk '/tcp/{print $NF}'|sort|uniq -c
4 CLOSE_WAIT
6 ESTABLISHED
2 LAST_ACK
2 LISTEN
求并集
$ cat test1.txt
c
a
b
$ cat test2.txt
c
b
d
$ cat test1.txt test2.txt |sort |uniq
a
b
c
d
很显然,两个文件合并后,再去重,就是并集了。
求交集
$ cat test1.txt test2.txt | sort | uniq -d
b
c
-d
选项的作用是只输出有重复的项,显然,两个文件合并,重复项就是交集。
求差集
$ cat test1.txt test2.txt test2.txt| sort | uniq -u
a
-u
选项的作用是只输出唯一的项,显然,如果test2.txt
中的项在text1.txt
中也存在,这一项就不会输出,另外,为了让test2.txt
的内容不输出,故意让其cat
了两次。
comm
comm
命令可以更直观的求并集,交集与差集,同样,交给comm
处理的数据,也要事先排好序,如下:
$ comm <(sort -u test1.txt) <(sort -u test2.txt)
a
b
c
d
<()
是bash下的命令替换语法,它类似于生成一个临时虚拟文件,且文件内容就是命令的输出内容。
如上,第一列是test1.txt
减test2.txt
的差集,第二列是test2.txt
减test1.txt
的差集,第三列就是交集。
如果只想要交集,可使用comm -1 -2
或comm -12
,-1 -2
表示不显示第一列与第二列,同理-3
就是不显示第三列。
啥,你说它没有并集?看下面,用tr
把空白删掉就好了嘛!
$ comm <(sort -u test1.txt) <(sort -u test2.txt)|tr -d '\t'
a
b
c
d
往期内容
mysql的timestamp会存在时区问题?
hex,base64,urlencode编码方案对比
字符编码解惑
真正理解可重复读事务隔离级别
Linux文本命令技巧(下)
Linux文本命令技巧(上)