比较两个文件:通过一列比较,行存在于一个中,而不存在于另一个中

new*_*wbi 6 text-processing file-comparison columns join

我需要比较 2 个文件。两个文件中的第 1 列相同。第 2 列是我要比较的内容:在比较第 2 列时,我希望文件 1 中所有不在文件 2 中的行。两个文件中的第 3 列不同,即使是第 1 列和第 2 列相同的行。我无法删除第 3 列,因为作为输出,我想要包含此列的文件 1 中的行。

下面是一个例子:

文件 1

21  12340   3
21  12341   7
21  12342   2
21  12343   89
21  12349   7
Run Code Online (Sandbox Code Playgroud)

档案 2

21  12340   55
21  12341   7
21  12343   89
21  12344   7
21  12346   88
21  12347   3
21  12348   37
Run Code Online (Sandbox Code Playgroud)

我的输出是:

21  12342   2
21  12349   7
Run Code Online (Sandbox Code Playgroud)

Pet*_*r.O 8

join要求对文件进行预排序,因为它们在 esample 的 args 中join),因此如果您需要维护输出的序列,则需要不同的方法。请注意,它不会尝试保持原始字段间距的宽度。

join -1 2 -2 2 -v 1 <(sort file1) <(sort file2)
Run Code Online (Sandbox Code Playgroud)

输出

21 12342 2
21 12349 7
Run Code Online (Sandbox Code Playgroud)


Bir*_*rei 6

一种awk解决方案:

awk '
    FNR == NR {
        data[ $2 ] = 1;
        next;
    }
    FNR < NR {
        if ( ! ($2 in data) ) {
            print $0;
        }
    }
' file2 file1
Run Code Online (Sandbox Code Playgroud)

结果:

21  12342   2
21  12349   7
Run Code Online (Sandbox Code Playgroud)


jan*_*nos 2

使用egrepawk

egrep -v -f <(awk '{printf "^%s[ ]+%s[ ]+\n", $1, $2}' file2) file1
Run Code Online (Sandbox Code Playgroud)

awk里面的位根据<()的内容生成模式file2。使用egrep这些模式来匹配 中的行file1,并-v反转匹配,仅打印不匹配的行。