zoukankan      html  css  js  c++  java
  • Linux 求文件交集 差集等

    使用comm命令

    假设两个文件FILE1和FILE2用集合A和B表示,FILE1内容如下:

    a
    b
    c
    e
    d
    a  

    FILE2内容如下:

    c
    d
    a
    c

    基本上有两个方法,一个是comm命令,一个是grep命令。分别介绍如下:

    comm命令 , 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. 要注意两个文件必须是排序和唯一(sorted and unique)的,默认输出为三列,第一列为是A-B,第二列B-A,第三列为A交B。

    直接运行结果如下:

    $ comm a.txt b.txt
    a
    b
                    c
            d
            a
            c
    e
    d
    a

    仅仅排序

    $ comm <(sort a.txt ) <(sort b.txt )
                    a
    a
    b
                    c
            c
                    d
    e 

    排序并且唯一

    $ comm <(sort a.txt|uniq ) <(sort b.txt|uniq )
                    a
    b
                    c
                    d
    e

    如果只想要交集,如下即可:

    $ comm -12 <(sort a.txt|uniq ) <(sort b.txt|uniq )
    a
    c
    d

    comm命令参数:
      -1   不显示只在第1个文件里出现过的列。
      -2   不显示只在第2个文件里出现过的列。
      -3   不显示只在第1和第2个文件里出现过的列。
      --help   在线帮助。
      --version   显示版本信息。


      comm命令比较两个已排序文件每行数据的差异,并将其结果显示出来,如果没有指定任何参数,comm命令读取这两个文件,然后生成三列输出:1>仅在file1中出现的行2>仅在file2中出现的行3>在两个文件中都存在的行。
      如果为文件名之一指定 -(减号),则 comm 命令会从标准输入设备读取数据。

    grep命令:

    grep 命令是常用的搜索文本内容的,要找交集,如下即可:

    p$ grep -F -f a.txt b.txt
    c
    d
    a
    c
    

    grep不要求排序,但是因为是集合操作,唯一是必须的(不然怎么是集合呢?)。所以:

    $ grep -F -f a.txt b.txt | sort | uniq
    a
    c
    d
    

    差集:

    $ grep -F -v -f a.txt b.txt | sort | uniq
    $ grep -F -v -f b.txt a.txt | sort | uniq
    b
    e
    

    第一行结果为B-A,所以为空;第二行为A-B。注意顺序很重要! 

    cat+sort+uniq

    1. 取出两个文件的并集(重复的行只保留一份)

        cat file1 file2 | sort | uniq

    2. 取出两个文件的交集(只留下同时存在于两个文件中的文件)

        cat file1 file2 | sort | uniq -d

     3. 删除交集,留下其他的行

        cat file1 file2 | sort | uniq -u

        如果需要计数也有一个很好的参数uniq -c 可以将相同行数的计数放在行首

     sort排序

        是根据从输入行抽取的一个或多个关键字进行比较来完成的。排序关键字定义了用来排序的最小的字符序列。缺省情况下以整行为关键字按ASCII字符顺序进行排序。

        改变缺省设置的选项主要有:

        - m 若给定文件已排好序,合并文件。

        - c 检查给定文件是否已排好序,如果它们没有都排好序,则打印一个出错信息,并以状态值1退出。

        - u 对排序后认为相同的行只留其中一行。

        - o 输出文件 将排序输出写到输出文件中而不是标准输出,如果输出文件是输入文件之一,sort先将该文件的内容写入一个临时文件,然后再排序和写输出结果。

        改变缺省排序规则的选项主要有:

        - d 按字典顺序排序,比较时仅字母、数字、空格和制表符有意义。

        - f 将小写字母与大写字母同等对待。

        - I 忽略非打印字符。

        - M 作为月份比较:“JAN”<“FEB”

        - r 按逆序输出排序结果。

        -k, -key=POS1[,POS2] posl - pos2 指定一个或几个字段作为排序关键字,字段位置从posl开始,到pos2为止(包括posl,不包括pos2)。如不指定pos2,则关键字为从posl到行尾。字段和字符的位置从0开始。

        - b 在每行中寻找排序关键字时忽略前导的空白(空格和制表符)。

        - t separator 指定字符separator作为字段分隔符。

        uniq命令

        文件经过处理后在它的输出文件中可能会出现重复的行。例如,使用cat命令将两个文件合并后,再使用sort命令进行排序,就可能出现重复行。这时可以使用uniq命令将这些重复行从输出文件中删除,只留下每条记录的唯一样本。

        语法:

        uniq [选项] 文件

        说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如果输入文件用“- ”表示,则从标准输入读取。

        该命令各选项含义如下:

        - c 显示输出中,在每行行首加上本行在文件中出现的次数。它可取代- u和- d选项。

        - d 只显示重复行。

        - u 只显示文件中不重复的各行。

        - n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。

        +n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。

        - f n 与- n相同,这里n是字段数。

        - s n 与+n相同,这里n是字符数。

  • 相关阅读:
    每日一题 为了工作 2020 0412 第四十一题
    每日一题 为了工作 2020 04011 第四十题
    每日一题 为了工作 2020 0410 第三十九题
    每日一题 为了工作 2020 0409 第三十八题
    每日一题 为了工作 2020 0408 第三十七题
    每日一题 为了工作 2020 0407 第三十六题
    每日一题 为了工作 2020 0406 第三十五题
    每日一题 为了工作 2020 0405 第三十四题
    学习总结(二十四)
    学习总结(二十三)
  • 原文地址:https://www.cnblogs.com/ywl925/p/3876314.html
Copyright © 2011-2022 走看看