-1

コード :

#!/usr/bin/perl

my $file = $ARGV[0];
my $position = $ARGV[1]; # POSITION OF THE RESIDUE

open (FILE, $file);

while (<FILE>) {
my @f = split;
if (($f[0] == "ANNOT_RESID_NO") && ($f[1] == $position)){
    push @line, $_;
}
}
print @line;
close(FILE);

入力:

ANNOT_TYPE[1] 0
ANNOT_TYPE_NAME[1] CATRES
ANNOT_NUMBER[1][1] 1
ANNOT_NAME[1][1] 3.1.3.16
ANNOT_DESC[1][1] Phosphoprotein phosphatase.
ANNOT_RESID_NO[1][1][1] 91
ANNOT_RESID_NAME[1][1][1] ASP
ANNOT_RESID_NUM[1][1][1]   95 
ANNOT_RESID_NO[1][1][2] 92
ANNOT_RESID_NAME[1][1][2] ARG
ANNOT_NRESID[1][1] 6
ANNOT_NUMBER[1][2] 2
ANNOT_NAME[1][2] 3.1.3.53
ANNOT_DESC[1][2] [Myosin-light-chain] phosphatase.
ANNOT_RESID_NO[1][2][1] 91
ANNOT_RESID_NAME[1][2][1] ASP
ANNOT_RESID_NUM[1][2][1]   95 
ANNOT_RESID_NO[1][2][2] 92
ANNOT_RESID_NAME[1][2][2] ARG

質問 :

「ANNOT_RESID_NO」で始まる行の has $position(たとえば 91) を含む行を印刷しています。この行に加えて、毎回 @line に出力したいのは、「ANNOT_DESC」を含むこの一致の上の最初の行です。この「ANNOT_DESC」行は、必ずしも一致した行のすぐ上の行であるとは限りません。

4

2 に答える 2

1

試してください(完全なコード):

#!/usr/bin/perl

use strict;
use warnings;

my $file = $ARGV[0];
my $position = $ARGV[1];

open (FILE, $file) or die $!;

my $desc;

my @line;

while (<FILE>) {
    my @f = split " ";

    if ( $f[0] =~ /^ANNOT_DESC/ ) {
        $desc = $_;
        next;
    }


    if ( $f[0] =~ /^ANNOT_RESID_NO/  and $f[1] == $position ) {
        push @line, $desc, $_;
    }
}

出力:

ANNOT_DESC[1][1] Phosphoprotein phosphatase.
ANNOT_RESID_NO[1][1][1] 91
ANNOT_DESC[1][2] [Myosin-light-chain] phosphatase.
ANNOT_RESID_NO[1][2][1] 91
于 2012-08-09T17:48:27.420 に答える
0

小さいデータ セットを使用すると、ファイルから配列 (@file_data など) に行をプッシュし、 @file_data 配列を反復して、必要な値を @line 配列にプッシュできます。

于 2012-08-09T16:40:50.777 に答える