1

我想比较两个具有不同列号和行号的大文件,并打印那些有共同词(如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

预先感谢您的帮助

4

3 回答 3

2

根据您提供的有限信息,

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
  • 您只对将 的第 4 列file1与 的第 3 列进行匹配感兴趣file2

它保持行的顺序,因为它们出现在file1.

于 2012-12-12T01:01:02.367 回答
2

你很接近,试试这个:

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 列是否在数组中,如果是,则打印出它的值和当前行。

于 2012-12-12T01:01:57.677 回答
0

我会为每个文件创建一个单独的单词散列到行号,并为每个文件创建一个存储每一行​​的数组。

然后我会迭代文件 1 中的单词列表,并在文件 2 中查找匹配项。如果找到匹配项,那么我会在两个文件中查找该单词的行号。使用行号,我将从数组中检索“行”,并返回唯一单词列表。

于 2012-12-12T01:00:51.247 回答