我想比较两个具有不同列号和行号的大文件,并打印那些有共同词(如KJ
)的行:
文件1:
XT1 123 aa NR
XT2 444 bb GF
XT3 666 aa KJ
文件2
fc KK pcn
wd CC KJ
输出
XT3 666 aa wd CC KJ
我试过了,但我什么也没得到:
awk 'FNR==NR{a[$4]=$3;next}{if (a[$3])print a[$3],$0}' file1 file2
预先感谢您的帮助
根据您提供的有限信息,
my $file1 = '...';
my $file2 = '...';
my %file2;
{
open(my $fh2, '<', $file2)
or die("Can't open \"$file2\": $!\n');
while (<$fh2>) {
my @F = split;
$file2{$F[2]} = join(' ', @F[0,1]);
}
}
{
open(my $fh1, '<', $file1)
or die("Can't open \"$file1\": $!\n');
while (<$fh1>) {
my @F = split;
print(join(' ', @F[0..2], $file2{$F[3]}, $F[3]), "\n")
if $file2{$F[3]};
}
}
我假设如下:
file2
适合内存作为行的散列。file2
。file1
与 的第 3 列进行匹配感兴趣file2
。它保持行的顺序,因为它们出现在file1
.
你很接近,试试这个:
awk 'FNR==NR { a[$4]=$1 FS $2 FS $3; next } $3 in a { print a[$3], $0 }' file1 file2
结果:
XT3 666 aa wd CC KJ
快速解释:
在“file1”中,将第 4 列添加到以第 1、2 和 3 列为值的数组中。
在“file2”中,检查第 3 列是否在数组中,如果是,则打印出它的值和当前行。
我会为每个文件创建一个单独的单词散列到行号,并为每个文件创建一个存储每一行的数组。
然后我会迭代文件 1 中的单词列表,并在文件 2 中查找匹配项。如果找到匹配项,那么我会在两个文件中查找该单词的行号。使用行号,我将从数组中检索“行”,并返回唯一单词列表。