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

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集合操作命令(交集、差集))