我的目的是比较三个文件中的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
等待帮助!提前谢谢
答案 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;