【问题标题】:Get a difference file by specific patterns in two text files通过两个文本文件中的特定模式获取差异文件
【发布时间】:2013-06-22 11:35:26
【问题描述】:

我有 2 个文本文件,我需要将“更改”导出到一个新文件。这意味着将第二个文件的行与第一个文件的行进行比较,如果在那里找不到行,那么它将把它附加到新的(第三个)文件中。

第一个文件的内容是:

ABC 123 q1w2sd DEF 321 sdajkn GHI 123 杰斯德纳伊 JKL 456 jsd223

第二个文件包含:

ABC 123 XXXXXX JKL 456 jsd223 DEF XXX sdajkn GHI 123 杰斯德纳伊

请注意,以 ABC 和 DEF 开头的行已更改。 JKL 刚刚改变了它的位置。

输出文件应包含: ABC 123 XXXXXX DEF XXX sdajkn

如何使用 'awk' 或 'sed' 做到这一点?

编辑:第二个文件中的新行也应计为更改..

【问题讨论】:

    标签: regex sed awk pattern-matching


    【解决方案1】:

    假设第一个文件命名为:fileA,第二个文件命名为:fileB,您可以像这样使用 awk:

    awk 'NR==FNR {a[$1];b[$0];next} ($1 in a) && !($0 in b)' file{A,B}
    

    或者简单地说:

    awk 'NR==FNR {a[$1];b[$0];next} ($1 in a) && !($0 in b)' file1 file2
    

    【讨论】:

    • 您是否将每行的第一列存储到“a”和“b”中?我试图理解.. b[$0] 表示第 0(第一)列被存储到“b”?谢谢
    • 我忘了提一件事。此外,添加到第二个文件中的新行也应计为更改。与第一个文件相比,基本上所有内容都是新的或更新的。
    • 是的,我可能想通了。我需要这个: awk 'NR==FNR {a[$0];b[$1];c[$2];next} (($0 in a ) && (!($1 in b) || !($2 in c))) || !($0 in a)' fileA fileB
    • 非常感谢您的帮助,您让我走上了正确的道路。答案非常接近。 +1
    • @Dropout:不客气。抱歉,我不在电脑旁,无法立即回复您的问题。很高兴看到您的问题得到解决。
    【解决方案2】:
    awk 'NR == FNR { f1[$0]; next } !($0 in f1)' file1 file2
    

    使用 grep: grep -Fvxf file1 file2

    【讨论】:

    • 这不是只比较第一列吗?
    • 不,它比较整行。
    • @Dropout In awk $0 是整行。 $1 是第一列,$2 是第二列,依此类推...
    • 哇,这真的很清楚。当任何行中的任何更改将其导出到第三个文件时,我为什么要一一检查每一列。很好的答案! :)
    • @JS웃 谢谢,这正是我直到现在才明白的事情 +1
    【解决方案3】:

    GNU 代码

    $sed 's#\(.*\)#/\1/d#' file1|sed -f - file2 ABC 123 XXXXXX DEF XXX sdajkn

    这也处理file2 中的“换行符”。

    【讨论】:

      【解决方案4】:

      使用comm 在第二个文件中查找不在第一个文件中的行:

      $ comm -13 <(sort first) <(sort second)
      ABC 123 XXXXXX
      DEF XXX sdajkn
      

      【讨论】:

        猜你喜欢
        • 2017-02-14
        • 2019-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-22
        • 2013-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多