比较bash中两个文件中除了最后N列以外的所有列

时间:2016-06-24 18:21:36

标签: bash awk diff

我有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。

3 个答案:

答案 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