2013-07-03 2 views
2

У меня есть два файла, файл 1 выглядит следующим образом:Если Столбец A в файле 1 равен столбец B в файле 2, печать линии

rs12126768 T 0.0252778071842686 
rs908742 A -0.0175531592475892 
rs3107147 A 0.0253753063312283 
rs3128309 A 0.0284902703996274 
rs16824948 T 0.0696193418800571 
rs2643888 A 0.0452601314048646 
rs3795272 T -0.0244976316004002 
rs2840531 T -0.0438473997802763 
rs10910060 A 0.0364283566135514 
rs1129332 T -0.0274739770007551 

файл 2 выглядит следующим образом:

1 rs908742 0 2033256 
1 rs3795272 0 2284195 
1 rs2840531 0 2286408 
1 rs1129332 0 2336210 
1 rs7512269 0 2418625 
1 rs2247308 0 2445406 
1 rs1980789 0 2455863 
1 rs3122922 0 2456203 
1 rs4648453 0 3025712 
1 rs6424069 0 3147030 

Если $ 1 в файл 1 встречается в $ 2 файла 2, я хочу, чтобы он печатал строку. Таким образом, желаемый результат будет:

rs908742 A -0.0175531592475892 
rs3795272 T -0.0244976316004002 
rs2840531 T -0.0438473997802763 
rs1129332 T -0.0274739770007551 

Заранее благодарю за любую помощь.

ответ

7

попробовать этот Однострочник:

awk 'NR==FNR{a[$2];next}$1 in a' file2 file1 
+0

+1 Как вы даже придумать что ?? : P –

+0

Удивительно, это сделал трюк! Получил это в книжной книге сейчас, спасибо! –

0

алгоритм я бы предложил сделать это просто хэширования. Прочитайте файл2 и запомните все в $ 2 файла2. Затем прочитайте файл1, и если $ 1 в файле1 находится в памяти, распечатайте строку.

Вот Perl-скрипт, который делает трюк:

use strict; 
open FILE2, "file2.txt"; 
my %remember; 
while(<FILE2>) { 
    chomp $_; 
    my @fields = split; 
    $remember{$fields[1]} = 1; 
} 
open FILE1, "file1.txt"; 
while(<FILE1>) { 
    chomp $_; 
    my @fields = split; 
    if(defined $remember{$fields[0]}) { 
      print "$_\n"; 
    } 
} 
Смежные вопросы