我有2个文件:一个有18列;另一个还有更多。我需要找到仅在前18列上不匹配的行,而忽略其他文件中的其余行。但是,我需要保留并打印整行(剪切不起作用)。
文件1:
F1 F2 F3....F18
A B C.... Y
AA BB CC... YY
文件2:
F1 F2 F3... F18... F32
AA BB CC... YY... 123
AAA BBB CCC... YYY...321
输出不在文件1中:
AAA BBB CCC YYY...321
输出不在文件2中:
A B C...Y
如果可能的话,我想尽可能少地使用diff或awk。
答案 0 :(得分:0)
您可以使用awk:
awk '{k=""; for(i=1; i<=18; i++) k=k SUBSEP $i} FNR==NR{a[k]; next} !(k in a)' file1 file2
18
字段来创建密钥答案 1 :(得分:0)
您可以使用grep:
grep -vf file1 file2
grep -vf <(cut -d" " -f1-18 file2) file1
答案 2 :(得分:0)
要获得两个文件之间的差异,你需要更多,类似于@ anubhava的回答
$ awk 'NR==FNR{f1[$0]; next}
{k=$1; for(i=2;i<=18;i++) k=k FS $i;
if(k in f1) delete f1[k];
else f2[$0]}
END{print "not in f1";
for(k in f2) print k;
print "\nnot in f2";
for(k in f1) print k}' file1 file2
可以重写以保留file2中的顺序
$ awk 'NR==FNR{f1[$0]; next}
{k=$1; for(i=2;i<=18;i++) k=k FS $i;
if(k in f1) delete f1[k];
else {if(!p) print "not in f1";
f2[$0]; print; p=1}}
END{print "\nnot in f2";
for(k in f1) print k}' file1 file2