匹配2 D数组中的值

时间:2012-08-09 12:52:36

标签: perl awk matching

#!/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.我试图匹配存在于二维数组的第二列(@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”的行。

2 个答案:

答案 0 :(得分:4)

awk也能完成这项工作时,无需切换到perl

for ( @grabbed ) {
    my @f = split;
    if ( $f[1] == $value ) {
        push @line, $_;
    }
}

答案 1 :(得分: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循环中执行所有处理。