比较不同表perl的值

时间:2014-11-24 08:37:37

标签: 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和amp;值之间的值。 col4 - table1。如果是这种情况,我想打印出col1&的相应值。 col2进入table1的新列。

因此,在此示例中,最终结果文件应如下所示:

 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和amp;值之间的值。 col4 - table1。

1 个答案:

答案 0 :(得分: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  
相关问题