2012-12-12 44 views
1

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

预先感谢您的帮助

+1

你的问题还不清楚。你是否要求匹配所有共享任何常用词的行,而不管它们出现在哪个文件中?如果'file'如图所示,但是在显示的两行之前'file2'有100,000行其他数据,您是否仍希望该匹配出现? –

+1

如果file1中的一行与file2中的多行匹配,或者相反,该怎么办?如果比赛是在不同的领域? –

+0

我只想打印那些在$ 4(file1)和$ 3(file2)中共享任何常见单词的行对。 – EpiMan

回答

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中。

+0

作品非常好,非常感谢:) :) – EpiMan

0

我创造的词语来行号的单独的散为每个文件, 和数组存储每行,为每个文件。

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

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 

快速的解释:

'文件1',加列4与1列的阵列,2和3,因为它是值。

在'file2'中,检查第3列是否在数组中,如果是,则打印出它的值和当前行。

+0

作品非常好,谢谢你这么多:) – EpiMan