1

我的目的是比较三个文件中的 ID 对。每个 ID 对都与一个值相关联。如果我在两个文件中找到相同的 ID 对,我想复制相关值并打印 ID 对和最终分数。如果在所有三个文件中都找到了 ID 对,我想要相同的。否则(对于“单个 ID 对”,仅在一个文件中找到)我想打印 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
  • 通过or将每一行拆分为@F数组。\s|
  • $F[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 回答