【问题标题】:How to extract some missing rows by comparing two different files in linux?如何通过比较linux中的两个不同文件来提取一些丢失的行?
【发布时间】:2023-04-07 05:54:01
【问题描述】:

我有两个不同的文件,其中一个文件中缺少一些行。我想制作一个新文件,包括两个文件之间的那些非常见行。例如,我有以下文件:

文件1:

id1 
id22 
id3 
id4 
id43 
id100 
id433 

文件2:

id1
id2
id22
id3
id4
id8
id43
id100
id433
id21

我想提取那些存在于file2中但不存在于file1中的行:

新文件:

 id2
 id8 
 id21

有什么建议吗?

【问题讨论】:

    标签: linux shell awk sed merge


    【解决方案1】:

    使用comm utility(假设bash作为外壳):

    comm -13 <(sort file1) <(sort file2)
    

    注意输入必须如何排序才能工作,所以你的增量也将被排序。

    comm 使用(交错的)3 列布局:

    • 第 1 列:仅在 file1 中的行
    • 第 2 列:仅在 file2 中的行
    • 第 3 列:两个文件中的行

    -13 抑制第 1 列和第 2 列,这仅打印 file2 独有的值。

    警告要被识别为两个文件共有的行,它们必须完全匹配 - 看似相同空格不同的行(如撰写本文时问题中的示例数据中的情况,其中file1 行有一个尾随空格)将匹配。

    cat -et 是一个可视化行尾和控制字符的命令,有助于诊断此类问题。

    例如,cat -et file1 将输出诸如id1 $ 之类的行,从而明显地在行尾有一个尾随空格(表示为$)。


    如果您不想清理file1,而是想按原样比较文件,请尝试:

    comm -13 <(sed -E 's/ +$//' file1 | sort) <(sort file2)
    

    从两个文件的行中修剪前导和尾随空格的通用解决方案:

    comm -13 <(sed -E 's/^[[:blank:]]+|[[:blank:]]+$//g' file1 | sort) \
             <(sed -E 's/^[[:blank:]]+|[[:blank:]]+$//g' file2 | sort)
    

    注意:上述sed 命令需要GNUBSD sed

    编辑:我只想更改 1 个字符,但最少 6 个...删除此...

    【讨论】:

    • no 此命令不会将非常见的作为输出。你自己试过吗?
    • @zara:更新后的答案现在应该提供解决您的问题所需的所有指导。回顾一下:您不知道您的file1 数据在每一行都有一个尾随空格,这阻止了comm 识别看似常见的行。
    【解决方案2】:

    您可以尝试对两个文件进行排序,然后计算重复行并仅选择计数为 1 的行

    sort file1 file2 | uniq -c | awk '$1 == 1 {print $2}'

    【讨论】:

      猜你喜欢
      • 2020-01-09
      • 2018-08-24
      • 2016-02-02
      • 1970-01-01
      • 2015-03-07
      • 2023-01-25
      • 2017-07-19
      • 1970-01-01
      • 2011-05-05
      相关资源
      最近更新 更多