比较具有不同列和行号的两个文件

时间:2012-12-12 00:46:17

标签: perl awk

我想比较具有不同列和行号的两个大文件,并打印那些具有常用词的行(如KJ):

文件1:

XT1 123 aa NR
XT2 444 bb GF 
XT3 666 aa KJ

file2的

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

提前感谢您的帮助

3 个答案:

答案 0 :(得分: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中不会出现两次。
  • 您只想将file1的第4列与file2的第3列匹配。

它维护file1中显示的行的顺序。

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

答案 2 :(得分:0)

我会为每个文件的行号创建一个单独的单词哈希值, 以及为每个文件存储每行的数组。

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

相关问题