2025年3月17日 星期一 甲辰(龙)年 月十六 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 系统应用 > Linux

使用uniq命令求并集交集差集

时间:01-26来源:作者:点击数:35

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.txttest2.txt的差集,第二列是test2.txttest1.txt的差集,第三列就是交集。

如果只想要交集,可使用comm -1 -2comm -12-1 -2表示不显示第一列与第二列,同理-3就是不显示第三列。

啥,你说它没有并集?看下面,用tr把空白删掉就好了嘛!

  • $ comm <(sort -u test1.txt) <(sort -u test2.txt)|tr -d '\t'
  • a
  • b
  • c
  • d
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门