2014-11-24 65 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,表2和COL2-table1的值之間的匹配。如果這是TRUE,那麼我想檢查col2-table2中的值是否在col3 & col4 - table1中的值之間。如果是這種情況,我想將col1的相應值(col)打印到col1的新列中。

所以在這個例子中,最終的結果文件應該是這樣的:

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 

開幕後和加載文件時,我開始與存儲數組的數組表2的值。

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,表2的價值和COL2-table1的之間的匹配。然後如何繼續檢查col2-table2中的值是否在col3 & col4 - table1中的值之間。

+1

請閱讀的perldoc perldsc和perllol的 – Vorsprung 2014-11-24 08:50:08

+1

可能重複的[找到的值的範圍內的2個值的](http://stackoverflow.com/questions/27063288 /發現值-IN-A-範圍爲2的值) – Sobrique 2014-11-24 09:39:19

回答

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