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

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

我需要比较两个文件。两个文件中的第 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

文件2

21  12340   55
21  12341   7
21  12343   89
21  12344   7
21  12346   88
21  12347   3
21  12348   37

我的输出是:

21  12342   2
21  12349   7

答案1

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

join -1 2 -2 2 -v 1 <(sort file1) <(sort file2)

输出

21 12342 2
21 12349 7

答案2

一种awk解决方案:

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

结果:

21  12342   2
21  12349   7

答案3

从 bash shell 使用 Python:

paddy$ python -c 'import sys
with open(sys.argv[2]) as f: file2col2 = {line.split()[1] for line in f}
with open(sys.argv[1]) as f: print("".join(line for line in f 
                                           if line.split()[1] not in file2col2))
' file1.tmp file2.tmp
21  12342   2
21  12349   7

paddy$ 

答案4

使用egrepawk

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

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

相关内容