2012-08-09 82 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