我需要比较两个文件。两个文件中的第 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
使用egrep
和awk
:
egrep -v -f <(awk '{printf "^%s[ ]+%s[ ]+\n", $1, $2}' file2) file1
awk
里面的位根据<()
的内容生成模式file2
。使用egrep
这些模式来匹配 中的行file1
,并-v
反转匹配,仅打印不匹配的行。