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是字符数。

  • 相关阅读:
    HTTP 501 错误 – 未实现 (Not implemented) 或者是 Failure: Address already in use
    HTTP 400 Bad request 原因
    树莓派 NAS aria2 下载磁力链接无速度
    踩坑备忘之“yarn : 无法加载文件 C:\Users\siazon\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。"
    架构小试之IDL
    服务端基本概念和指标
    git常用命令
    mysql20211116
    blog JavaJinguo
    android 分享功能
  • 原文地址:https://www.cnblogs.com/ywl925/p/3876314.html
Copyright © 2011-2022 走看看