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)
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)
一种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)
使用egrep和awk:
egrep -v -f <(awk '{printf "^%s[ ]+%s[ ]+\n", $1, $2}' file2) file1
Run Code Online (Sandbox Code Playgroud)
awk里面的位根据<()的内容生成模式file2。使用egrep这些模式来匹配 中的行file1,并-v反转匹配,仅打印不匹配的行。