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
    
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容