匹配三个文件之间的对象并将与perl关联的分数相乘

时间:2013-10-08 15:07:11

标签: perl

我的目的是比较三个文件中的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

等待帮助!提前谢谢

2 个答案:

答案 0 :(得分:2)

  • @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

答案 1 :(得分: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;