2012-12-12 45 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