AWK比较2个文件中的2列,如果一个相等则打印而另一个不相同

时间:2017-09-12 20:44:17

标签: unix awk

如果两个文件中的第一列匹配但第3列不匹配,我试图从文件一中打印文件1 +第3列中的所有行。

示例:

File1  
John  12  Mango  
David  13  Apple  
Jack 14  Orange  

File2   
John  12  Grape  
David  13  Apple  
Jack 14  Apple  

输出

John 12 Mango Grape  
Jack 14 Orange Apple

我尝试了不同的awk命令,但是当两个列都匹配时它们都可以工作,但是当只有1列匹配而我需要打印时,我需要打印。我是脚本和Unix命令的新手,我很感激对提出的解决方案的解释。

4 个答案:

答案 0 :(得分:1)

$ awk 'NR==FNR{a[$1]=$3; next} ($1 in a) && (a[$1] != $3){print $0, a[$1]}' file2 file1
John 12 Mango Grape
Jack 14 Orange Apple

答案 1 :(得分:0)

awk解决方案:

$ cat tst.awk
NR==FNR { a[$1" "$2]=$3; next }
{ s=$1" "$2;
  if (s in a && a[s] != $3)
     printf("%s %s %s\n", s, a[s], $3)
}

运行:

$ awk -f tst.awk input1.txt input2.txt
John 12 Mango Grape
Jack 14 Orange Apple
  

EDIT通用版:匹配第1列,列col不匹配

$ cat tst2.awk
BEGIN {col=3}
NR==FNR { a[$1]=$0; next }
$1 in a {
   split(a[$1],b," ");
   if ($col!=b[col])
       print a[$1], $col
}

您甚至可以从awk文件中删除BEGIN并添加变量col命令行,如下所示:

$ awk -v col=3 -f tst2.awk input1.txt input2.txt
John 12 Mango Grape
Jack 14 Orange Apple

答案 2 :(得分:0)

粘贴 + awk 方法:

paste <(sort file1) <(sort file2) | awk '$1==$4 && $3!=$6{ print $1,$2,$3,$6 }'

输出:

Jack 14 Orange Apple
John 12 Mango Grape

答案 3 :(得分:0)

如果您需要通用解决方案,请遵循一个简单的Perl脚本(约30行),它应该适用于文件中的任意数量的列以及作为输入参数给出的匹配/不匹配的列号 -

use strict;

my @f1; my @f2;

open F, config()->{file1} or die $!;
while (<F>){
  chomp;
  next unless /\S+/;
  push @f1, [ split /\s+/ ];
}
close F;

open F, config()->{file2} or die $!;
while (<F>){
  chomp;
  next unless /\S+/;
  push @f2, [ split /\s+/ ];
}
close F;

my $c1 = config()->{'match_col_num'}-1;
my $c2 = config()->{'mismatch_col_num'}-1;

for my $l1 (@f1){
  for my $l2 (@f2){
    if ($l1->[$c1] eq $l2->[$c1] and $l1->[$c2] ne $l2->[$c2]){
      print join " ", (@{$l1}, $l2->[$c2]);
      print "\n";
    }
  }
}

请参阅https://github.com/melezhik/file-compare-columns

上的使用信息