我有一个看起来像这样的数据(邻接矩阵):
foo bar 0.14 qux 0.2
bar foo 0.14 qux 0.4
qux foo 0.2 bar 0.4
我想要做的是将它们转换成成对表:
foo bar 0.14
foo qux 0.2
bar qux 0.4
但是我坚持使用以下代码。这样做的正确方法是什么?
use strict;
while ( <DATA> ) {
chomp;
next if (/^>/);
my $line = $_;
my @els = split(/\s+/,$line);
my $pivot = $els[0];
my $genen = '';
my $score = '';
foreach my $id ( 0 .. $#els ) {
next if ($id == 0);
if ( $id % 2 != 0 ) {
# gene name
#print "$els[$id]\n";
$genen = $els[$id];
}
else {
#
$score = $els[$id];
}
print "$pivot $genen $score\n";
}
#print "--\n";
}
__DATA__
foo bar 0.3 qux 0.2
bar foo 0.15 qux 0.4
qux foo 0.3 bar 0.4
答案 0 :(得分:1)
针对评论进行了更新
这是一个简化版本,看起来更加不言自明,而且更加强大:
#!/usr/bin/perl
use warnings;
use strict;
sub transpose
{
my $pivot = shift || die "pivot required";
while (my ($genen, $score) = (shift, shift))
{
last unless $score and $genen;
print "$pivot $genen $score\n";
}
}
for (<DATA>) {
chomp;
transpose(split /\s+/) unless m/^>/;
}
__DATA__
foo bar 0.3 qux 0.2
bar foo 0.15 qux 0.4
qux foo 0.3 bar 0.4
输出:
foo bar 0.3
foo qux 0.2
bar foo 0.15
bar qux 0.4
qux foo 0.3
qux bar 0.4
答案 1 :(得分:1)
awk '{print $1,$2,$3} {print $1,$4,$5}' file