-2

次のような値を含むファイル (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.. は同じケースの異なる例です)。今行う比較は次のとおりです。

2 番目の列の値が同じケースの対応する例よりも低く、3 番目の列の値が対応する値よりも高い場合、行を出力する必要があります。

たとえば、最初の 2 行は、2 番目の列の値が 70<100 であるのに 1.64119 > 1.55602 の場合です (これは出力する必要があります)。

残りの 2 つのケースは、$2(example1) > $2 (example2) および $3(example1) > $3 (example2) の場合です。

同じハッシュ (ケース) の例が約 10 ある可能性があります。

4

1 に答える 1

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 と比較するか、最後に見たものか最後に印刷したものかを明確に指定していませんでした。

于 2012-07-05T18:15:12.650 に答える