Perl 比较不同表的值

Perl 比较不同表的值,perl,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

我有两个以制表符分隔的表:

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中的值是否匹配。如果这是真的,那么我想检查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;
     ... 
}
my@table2;
而(){
下一步if/^\s*#/##跳过标题行
我的@columns=split;
下一步如果$columns[1]=~/\D/;
按@table2,\@列;
}
而(){
我的@columns=split;
... 
}

现在如何检查col3-table2和col2-table1中的值是否匹配。然后如何继续检查col2-table2中是否有介于col3和col4-table1中的值之间的值。

幸运的是,我的记事本中仍然有上次的代码

根据更改后的需求,我做了一些更新。这应该符合你的要求。(在没有内联的情况下将表数据输入,留给读者作为练习)


请阅读perldoc perldsc和可能的副本
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