美文网首页
Linux集合操作命令(交集、差集)

Linux集合操作命令(交集、差集)

作者: 鹅鹅鹅_ | 来源:发表于2019-01-01 11:53 被阅读0次

Linux集合操作命令


  1. comm命令
  • man手册

    [hadoop@master ~]$ man comm
    NAME
       comm - compare two sorted files line by line
    
    SYNOPSIS
           comm [OPTION]... FILE1 FILE2
    
    DESCRIPTION
           Compare sorted files FILE1 and FILE2 line by line.
    
           With  no  options,  produce three-column output.  Column one contains lines unique to FILE1, column two contains
           lines unique to FILE2, and column three contains lines common to both files.
    
           -1     suppress column 1 (lines unique to FILE1)
    
           -2     suppress column 2 (lines unique to FILE2)
    
           -3     suppress column 3 (lines that appear in both files)
    
    

    以上是comm命令man手册的说明,要注意两个文件必须是排序和唯一(sorted and unique)的,默认输出为三列,第一列为是A-B,第二列B-A,第三列为A交B。

  • 示例文件
    A.txt文件代表集合A,B.txt代表集合B,即:A={a,b,g,c},B={f,b,a,r}

    [hadoop@master test]$ cat A.txt 
    a
    b
    g
    c
    [hadoop@master test]$ cat B.txt 
    f
    b
    a
    r
    
  • 直接运行
    先来看看直接运行comm命令的效果

    [hadoop@master test]$ comm A.txt B.txt 
    a
    b
        f
    comm: 文件2 没有被正确排序
        b
        a
    g
    comm: 文件1 没有被正确排序
    c
        r
    
    

    输入文件应该先进行排序,并且保证唯一。
    可以看到,默认输出为三列,第一列为是A-B即只出现在A中而不出现在B中的元素,第二列B-A即只出现在B中而不出现在A中的元素,第三列为A交B即既出现在A中又出现在B中的元素。

    [hadoop@master test]$ comm < (sort A.txt | uniq) < (sort B.txt | uniq)
    -bash: syntax error near unexpected token `('
    [hadoop@master test]$ comm < (sort A.txt | uniq) <(sort B.txt | uniq)
    -bash: syntax error near unexpected token `('
    #A={a,b,g,c},B={f,b,a,r}。第一列为A-B={c,g};第二列为B-A={f,r},第三列为A交B={a,b}
    [hadoop@master test]$ comm <(sort A.txt | uniq) <(sort B.txt | uniq)
            a
            b
    c
        f
    g
        r
    
    
  • 只求差集或交集
    使用comm命令行参数:
    -1 不显示只在第1个文件里出现过的列。
    -2 不显示只在第2个文件里出现过的列。
    -3 不显示只在第1和第2个文件里出现过的列。

    #求A-B
    [hadoop@master test]$ comm -23 <(sort A.txt | uniq) <(sort B.txt | uniq)
    c
    g
    #求B-A
    [hadoop@master test]$ comm -13 <(sort A.txt | uniq) <(sort B.txt | uniq)
    f
    r
    #求你A交B
    [hadoop@master test]$ comm -12 <(sort A.txt | uniq) <(sort B.txt | uniq)
    a
    b
    
  1. grep命令

    grep 命令是常用的搜索文本内容的Linux命令。其-F命令参数指明要超找的模式字符串参数,此模式字符串也可以通过-f从文件加载。故利用grep命令进行集合操作的原理即将一个集合作为查找模式在另一个集合中进行查找。grep查找不需要事先进行排序。

  • 求交集AB
    #通过在B.txt中查找A.txt中的字符串模式来求AB交集,虽然grep不要求排序,但是集合操作需要保证唯一。
    [hadoop@master test]$ grep -F -f A.txt B.txt | sort | uniq
    a
    b
    [hadoop@master test]$ grep -F -f B.txt A.txt | sort | uniq
    a
    b
    
  • 求差集
    利用grep的-v选项,即反向选择,亦即显示出没有 '搜寻字符串' 内容的那些行。
    #A-B={c,g};B-A={f,r}
    [hadoop@master test]$ grep -F -v -f A.txt B.txt | sort | uniq
    f
    r
    [hadoop@master test]$ grep -F -v -f B.txt A.txt | sort | uniq
    c
    g
    
  1. cat+sort+uniq

    基本原理是利用sort排序后产生的单行和重复行来进行集合操作。同时将A、B文件sort后产生的输出,若某个元素只出现了一次,即单行,则说明它在sort前只存在于A中或B中,而不可能即出现在A中又出现在B中。若某个元素sort后出现了多行,则说明在sort之前它即存在于A中又存在于B中。当然,这里有个大前提就是A和B集合中的元素都是唯一只出现一次的。

  • 求AB并集

    [hadoop@master test]$ cat A.txt B.txt | sort | uniq
    a
    b
    c
    f
    g
    r
    
    
  • 求AB交集
    利用uniq的-d选项:
    -d, --repeated
    only print duplicate lines

    [hadoop@master test]$ cat A.txt B.txt | sort | uniq -d
    a
    b
    
    
  • 求AB交集之外的集合
    利用uniq的-u选项:
    -u, --unique
    only print unique lines

    [hadoop@master test]$ cat A.txt B.txt | sort | uniq -u
    c
    f
    g
    r
    
    

相关文章

  • Linux集合操作命令(交集、差集)

    Linux集合操作命令 comm命令 man手册[hadoop@master ~]$ man commNAME ...

  • Python精简入门学习(十三)

    Python精简入门学习之集合 -set -创建集合 -添加操作 -清空操作 -差集操作 -交集操作 -并集操作 ...

  • 学习js数据结构与算法4—集合

    集合 集合是由一组无序且唯一的项组成的 6.1 创建一个集合 6.2 集合操作 并集,交集,差集,子集

  • javaScript数据结构--集合

    集合是由一组无序且唯一的项组成的: 集合可以进行 并集、交集、差集、子集操作。 集合的代码实现: function...

  • 如何实现高性能集合操作(intersect)

    交集、并集、差集是集合操作中经常遇见的需求,本文分享一种基于hash的标记算法来实现高性能的合集操作本文以交集(i...

  • 集合间操作:交集、并集、差集

    下面截取阮一峰ES6对Set的说明案例: https://mp.weixin.qq.com/s/XAbvC-zyT...

  • 抽象代数简介

    集合 交集·并集·差集 在中学阶段就学习过集合,部分内容不再赘述。以下是交集、并集、差集的概念: 幂集 设是一个集...

  • Python Day03

    集合操作: ·去重,把一个列表边城集合,就自动去重 ·关系测试,测试两组数据之前的交集、差集、并集等关系 ...

  • Guava 学习

    guava Splitter 学习 guava Sets 集合类取交集、差集、并集

  • 集合

    集合是一种无序且元素唯一的容器。可通过 set 函数或大括号创建。 集合支持数学上的集合操作,如联合、交集、差集、...

网友评论

      本文标题:Linux集合操作命令(交集、差集)

      本文链接:https://www.haomeiwen.com/subject/kfrnlqtx.html