2012-08-09 86 views
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; 

问题的值:匹配在2 d阵列

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”的行。

+0

嗯...对于这个问题大学创建。你尝试过递归函数吗? – 2012-08-09 12:57:33

回答

4

不需要切换到awk当该作业也可以用perl完成。

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

....... push @line,$ _; } print @line“\ n”; }这是创建一个永无止境的循环。你能指出我的问题吗? – user1504209 2012-08-09 13:30:45

+0

在'for'循环后,所有符合条件的行都将保存在'@ line'数组中。 – Birei 2012-08-09 13:35:52

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循环中执行所有处理。

+0

谢谢。后来我有代码将使用这个数组为不同的东西。尽管我现在面临的一个问题是,当我把$ value = 9的时候,它会抓住9,19,90-99。我如何限制这只到9? – user1504209 2012-08-09 13:21:42

+0

此外,因为在不同的列中有类似的情况下匹配,不会regexp是“硬编码”吗? – user1504209 2012-08-09 13:27:32

+0

通过if解决它(/^\ s * \ d + \ s + $ position \ s + /)。如果有人能够以更一般的方式来浏览专栏,仍然会很感激。最好的办法是,如果我可以传递一个参数,例如“if $ grabbed [$ column] = .... {print the line}” – user1504209 2012-08-09 13:32:52