2011-04-25 24 views
1

組系列連續數我有一個數據輸入,看起來像這樣:如何在Perl

seq 75  T G - 
seq 3185 A R + 
seq 3382 A R + 
seq 4923 C - + * 
seq 4924 C - + * 
seq 4925 T - + * 
seq 5252 A W + 
seq 7400 T C - 
seq 16710 C - - # 
seq 18248 T C - 
seq 18962 C - + * 
seq 18963 A - + * 
seq 18964 T - + * 
seq 18965 A - + * 
seq 19566 A M + 

The input above is already sorted at 2nd column. 

我想要做的是:

  1. 只有把線,其中第4列是「 - 」。
  2. 如果這些行包含連續的位置(第2列),它們分組
  3. 它們表示爲具有最低位置作爲新的位置 和分組字母新字符串的串聯一個新行。

因此,我們希望得到這樣的輸出:

seq 75  T G - 
seq 3185 A R + 
seq 3382 A R + 
seq 4923 CCT - + ** 
seq 5252 A W + 
seq 7400 T C - 
seq 16710 C - - # 
seq 18248 T C - 
seq 18962 CATA - + ** 
seq 19566 A M + 

** Are the new lines/string formed by * line in first list (input) 
# line is kept as it is because there is no consecutive position after that. 

我堅持下面的邏輯,不知道如何着手:

while (<>) { 
    chomp; 

    my @els = split(/\s+/,$_); 

    # Process indel 
    my @temp =(); 
    if ($els[3] eq "-" ) { 
     push @temp, $_; 
    } 

    # How can I group them appropriately. 
    print Dumper \@temp ; 

    # And print accordingly to input ordering 

} 

回答

5

這是控制通斷的變化報告。此代碼似乎做的工作:

use strict; 
use warnings; 

my($prev) = -100; 
my($grp0) = $prev; 
my($col2, $col4); 

sub print_group 
{ 
    my($grp0, $col2, $col3, $col4) = @_; 
    printf "seq %-5d %-4s %s %s\n", $grp0, $col2, $col3, $col4 
     if ($grp0 > 0); 
} 

while (<>) 
{ 
    chomp; 
    my @els = split(/\s+/,$_); 
    if ($els[3] ne "-") 
    { 
     print_group($grp0, $col2, "-",  $col4); 
     print_group($els[1], $els[2], $els[3], $els[4]); 
     $prev = -100; 
     $grp0 = -100; 
     $col2 = ""; 
     $col4 = ""; 
    } 
    elsif ($els[1] == $prev + 1) 
    { 
     $grp0 = $prev if $grp0 < 0; 
     $prev = $els[1]; 
     $col2 .= $els[2]; 
     $col4 = $els[4]; 
    } 
    else 
    { 
     print_group($grp0, $col2, "-", $col4); 
     $prev = $els[1]; 
     $grp0 = $els[1]; 
     $col2 = $els[2]; 
     $col4 = $els[4]; 
    } 
} 

print_group($grp0, $col2, $col4); 

輸出示例:

seq 75  T  G - 
seq 3185 A  R + 
seq 3382 A  R + 
seq 4923 CCT - + 
seq 5252 A  W + 
seq 7400 T  C - 
seq 16710 C  - - 
seq 18248 T  C - 
seq 18962 CATA - + 
seq 19566 A  M + 

這是一個比較均勻的輸出比以前的版本,但基本的邏輯是非常像以前一樣。輸出總是由相同的函數生成的,所以一切儘可能均勻。

獲得條件正確可能非常困難 - 需要多次(太多)迭代來獲得此代碼才能產生預期的輸出。