1

私の目的は、3 つのファイルにある ID ペアを比較することです。各 ID ペアは値に関連付けられています。2 つのファイルで同じ ID ペアを見つけた場合は、関連する値を複製し、ID ペアと最終スコアを出力します。ID ペアが 3 つのファイルすべてにある場合は、同じことが必要です。それ以外の場合 (「単一の ID ペア」の場合、1 つのファイルでのみ見つかります)、ID ペアと値を出力したいと思います。特定のポイントは、各ペアの ID の順序に関連しています。各ペアの ID の順序はファイルごとに異なる可能性があるため、ID ペアを比較する際にはこの点に留意する必要があります。私のファイルは次のようになります。

ros.txt
a|b 1
d|c 2
f|t 3
g|i 4

exp.txt
a|b 1
c|d 2
e|f 3
g|h 4

phy.txt
b|a 1
d|c 2
f|e 3
g|p 4

これまでに行ったことは次のとおりです。

   #!/usr/bin/perl
    use warnings;
    use strict;

    my %rosetta;
    open (my $ROS, '<', 'ros.txt') or die "$!";
    while (<$ROS>) {
    my ($tmp_r,$vr)=split/\t/;
    next if $vr =~/NA/;
    my ($r1,$r2)=split/\|/,$tmp_r;
    next if $r1 eq $r2;

    my %expression;
    open (my $EX, '<', 'exp.txt') or die "$!";
    while (<$EX>) {
    my ($tmp_e,$ve)=split/ /;
    next if $ve =~/NA/;
    my ($e1,$e2)=split/\|/,$tmp_e;
    next if $e1 eq $e2;

    my %phyloge;    
    open (my $PHY, '<', 'phy.txt') or die "$!"_;
    while (<$PHY>) {
    my ($tmp_p,$vp)=split/ /;
    next if $vp =~/NA/;
    my($p1,$p2)=split/\|/,$tmp_p;
    next if $p1 eq $p2;     
    }
    }
    }

この時点で先に進むことができず、問題を解決するための提案が必要です。私の望ましい出力は次のとおりです。

a|b 1
c|d 8
f|t 3
e|f 9
g|h 4
g|i 4
g|p 4

助けを待っています!前もって感謝します

4

2 に答える 2

2
  • またはですべての行を@F配列に分割します。\s|
  • $F[2]最初の 2 つの要素の前の値を掛けます (並べ替え済み@F[0,1])

perl -F'[\s\|]' -lane'
  $k = join "|", sort @F[0,1];
  $s{$k} = ($s{$k}||1) * $F[2];
  END {
    print "$_ $s{$_}" for sort keys %s;
  }
' ros.txt exp.txt phy.txt

出力

a|b 1
c|d 8
e|f 9
f|t 3
g|h 4
g|i 4
g|p 4
于 2013-10-08T15:27:39.393 に答える
1
use warnings;
use strict;

my $data   = {};
my $result = {};
my @files  = qw( ros.txt exp.txt phy.txt );

foreach my $file ( @files )
{
    open FILE, '<', $file or die "$!";
    while( <FILE> )
    {
        if( /^(\w)\|(\w) (NA|\d+)$/ )
        {
            if( $3 ne 'NA' )
            {
                my @pair = ($1,$2);
                $data->{ $file }->{ join( '|', sort( @pair ) ) } = $3;
            }
        }
    }
    close FILE;
}

foreach my $file ( @files )
{
    my $curr_file = $data->{ $file };
    delete $data->{ $file };

    foreach my $pair ( keys %$curr_file )
    {
        $result->{ $pair } = $curr_file->{ $pair };

        foreach my $other_file ( @files )
        {                
            my $val = $data->{ $other_file }->{ $pair };
            if( defined $val )
            {
                $result->{ $pair } *= $val;
                delete $data->{ $other_file }->{ $pair };
            }
        }            
    } 
}

print "$_ $result->{ $_ }\n" foreach sort keys %$result;
于 2013-10-08T15:26:52.747 に答える