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