我有两个制表符分隔的表:
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。
答案 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