-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”开头的行,我正在打印带有 $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 回答