从文件加载哈希并进行比较

时间:2012-07-05 14:02:50

标签: perl sorting hash

我有一个文件(abc.txt),其中包含以下值:

ENSP00000200691_1 70.00 1.64119
ENSP00000200691_3 100.00 1.55602
ENSP00000201943_1 93.00 1.14492
ENSP00000201943_2 64.00 1.2178
ENSP00000201943_3 75.00 1.43107
ENSP00000203407_2 90.00 2.04312
ENSP00000203407_4 71.00 1.8197

我想创建一个散列,其中诸如ENSP00000200691之类的值将成为关键(_1,_2 ..是相同情况的不同示例)。现在进行的比较是:

当第二个coloumn值低于相同情况的相应示例时,然而第三个coloumn值高于相应的值 - 它应该打印行。

例如,前两行是这样的情况,其中第二列值70 <100而非1.64119> 1。 1.55602(应该打印)

其他两个案例的其余部分是2美元(例1)&gt; $ 2(example2)以及$ 3(example1)&gt; 3美元(例2)。

大约有10个相同哈希(case)的例子

1 个答案:

答案 0 :(得分:1)

以下是对如何解决(作业?)问题的猜测:

#!/usr/bin/perl

use strict;
use warnings;

my %info;

while (my $line=<DATA>) {
    chomp $line;
    my ($protein_id, $length, $value)=split /\s+/, $line;
    $protein_id=~s/_\d+$//;

    if (exists $info{$protein_id}) {
        if ($length<$info{$protein_id}->{length} &&
            $value>$info{$protein_id}->{value}) {
            print "$line\n";
        }
    }
    else {
        $info{$protein_id}={ length=>$length, value=>$value };
    }
}

__DATA__
ENSP00000200691_1 70.00 1.64119
ENSP00000200691_3 100.00 1.55602
ENSP00000201943_1 93.00 1.14492
ENSP00000201943_2 64.00 1.2178
ENSP00000201943_3 75.00 1.43107
ENSP00000203407_2 90.00 2.04312
ENSP00000203407_4 71.00 1.8197

运行时的输出是:

ENSP00000201943_2 64.00 1.2178
ENSP00000201943_3 75.00 1.43107

您没有明确指定是否应始终将后续行与第一个蛋白质ID进行比较,或者是否显示最后一个,或最后一个打印。