2014-11-24 4 views
0

У меня есть две вкладки разделителями таблицы:сравнить значения различных таблиц PERL

table1 

col1 col2 col3 col4 
id1  1  1  10 
id2  1  15  20 
id3  1  30  35 
id4  2  10  15 


table2 

col1 col2 col3 
rs1  5  1 
rs2  11  1 
rs3  34  1 
rs4  35  1 

я сначала хочу, чтобы проверить, есть ли соответствие между значением в COL3-table2 и col2-table1. Если это TRUE, я хочу проверить, есть ли значения в col2-table2, которые находятся между значениями в col3 & col4 - table1. Если это так, я хочу распечатать соответствующие значения (значения) col1 & col2 в новый столбец таблицы1.

Таким образом, в этом примере, файл конечных результатов должен выглядеть следующим образом:

table output 
col1 col2 col3 col4 new_col1  
id1  1  1  10  rs1:5 
id2  1  15  20  
id3  1  30  35  rs3:34, rs4:35  
id4  2  10  15 

После открытия и загрузка файлов, я начал с хранением значений table2 в массивах массивов.

my @table2; 
    while (<$table2>){ 
     next if /^\s*#/; #to skip header lines 
     my @columns = split; 
     next if $columns[1] =~ /\D/; 
     push @table2, \@columns; 
     } 

while (<$table1>){ 
    my @columns = split; 
    ... 
} 

Как я могу проверить, есть ли совпадение между значением в col3-table2 и col2-table1. И как же продолжить проверку, есть ли значения в col2-table2, которые находятся между значениями в col3 & col4 - table1.

+1

пожалуйста, прочитайте perldoc perldsc и perllol – Vorsprung

+1

возможного дубликата [найти значение в диапазоне от 2 значений] (http://stackoverflow.com/questions/27063288/найти-значения-в-диапазон-2 из-значений) – Sobrique

ответ

1

К счастью, у меня все еще есть код с последнего раза в моем блокноте.

Я сделал пару обновлений на основе измененного требования. Это должно делать то, что вы просите. (Подача данных таблицы без инкрустации остается в качестве упражнения для читателя).

use strict; 
use warnings; 
use Data::Dumper; 

my %table2; 

while (<DATA>) { 

    #stop reading if we've finished with table2 
    last if m/^table1/; 

    next unless m/^rs/; 
    my ($col1, $col2, $col3) = split(/\s+/); 
    $table2{$col1}{$col3} = $col2; 
} 

print "The story so far...:\n"; 
print Dumper \%table2; 


print "table output\n"; 
print join("\t", qw (col1 col2 col3 col4 new_col1)), "\n"; 
while (<DATA>) { 
    next unless m/^id/; 
    chomp; 
    my ($rowid, $col2, $lower, $upper) = split(/\s+/); 
    my $newcol = ""; 
    foreach my $rs (keys %table2) { 
     if (defined $table2{$rs}{$col2} 
      and $table2{$rs}{$col2} >= $lower 
      and $table2{$rs}{$col2} <= $upper) 
     { 
      $newcol .= " $rs:$table2{$rs}{$col2}"; 
     } 
    } 
    print join("\t", $rowid, $col2, $lower, $upper, $newcol,), "\n"; 
} 


__DATA__ 
table2 
col1 col2 col3 
rs1  5  1 
rs2  11  1 
rs3  34  1 
rs4  35  1 

table1 
col1 col2 col3 col4 
id1  1  1  10 
id2  1  15  20 
id3  1  30  35 
id4  2  10  15 

Это дает выход:

The story so far...: 
$VAR1 = { 
      'rs3' => { 
        '1' => '34' 
        }, 
      'rs4' => { 
        '1' => '35' 
        }, 
      'rs2' => { 
        '1' => '11' 
        }, 
      'rs1' => { 
        '1' => '5' 
        } 
     }; 

table output 
col1 col2 col3 col4  new_col1 
id1  1  1  10  rs1:5 
id2  1  15  20 
id3  1  30  35  rs3:34 rs4:35 
id4  2  10  15 
Смежные вопросы