使用Perl将邻接矩阵转换为成对表格式

时间:2013-04-22 07:28:28

标签: perl unix matrix

我有一个看起来像这样的数据(邻接矩阵):

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

2 个答案:

答案 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