如果两个文件中的第一列匹配但第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命令的新手,我很感激对提出的解决方案的解释。
答案 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";
}
}
}
上的使用信息