0
#!/usr/bin/perl

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

my @grabbed;

open (FILE, $file);

while (<FILE>) {
    if (/alignment#  residue#/) {
            push @grabbed, $_;
            while (<FILE>) {
            last if /^$/;
            push @grabbed, $_;
            }
    }
}
close (FILE);


my $line= `awk '  {if(\$2==$value)} ' @grabbed`;

print $line;

問題 :

1.まず、配列でawkを実行できるかどうかわかりませんか?2. 2次元配列の2番目の列(@grabbed)に存在する値を一致させようとしています。@grabbedは次のようになります:

     7         1         M     1.000         6                .VPMLG     66.63
     8         2         S     1.000        10            .QINTSARKG     66.63
     9         3         V     1.000        13         .KTAVFPRGQMSL     66.63
    10         4         L     1.000         7               .SLAKFT     66.63
    11         5         L     1.000        14        .ALSVQWIKMRYPF     66.63
    12         6         R     1.000        16      .DERSAVGTNQLYMIP     66.63
    13         7         S     1.000        18    .GDTHPKRSALFCIQVYN     66.63
    14         8         G     1.000        17     .DRFLENGAQPSTYCHM     66.63
    15         9         L     1.000        19   .NDHPELASVKRCWFGTQI     66.63
    16        10         G     1.000        18    .RLDPEGFTYAVCIKNMH     66.63

列2の値が「9」である行を一致させて取得しようとしています。

4

2 に答える 2

4

awkその仕事がいつできるかを考える必要はありませんperl

for ( @grabbed ) {
    my @f = split;
    if ( $f[1] == $value ) {
        push @line, $_;
    }
}
于 2012-08-09T13:03:57.023 に答える
3

「2D配列」とは、文字列の配列を意味し、各文字列は空白で区切られた値のリストであるように見えます。

Perlはこの種のもののために作られています。各行を分割して各値を確認するという、他の回答の提案を使用できます。ただし、単純な正規表現の方が高速です。awk行を次のようなものに置き換えます。

foreach (@grabbed)
{
     #Match the beginning of the line, possibly some whitespace, 
     #then some digits, then more whitespace, then the contents of $value
     if (/^\s*\d+\s+$value/)
     {
          #The line matched: do stuff
     }
}

また、一致しない行を確認する必要がありますか?そうでない場合は、ファイル全体を配列に入れない方がはるかに効率的です。代わりに、whileループ内ですべての処理を実行してください。

于 2012-08-09T13:13:46.740 に答える