2016-08-18 4 views
0

이 질문이 될 수도 있습니다. 너무 일반화되었지만 완전히 막혔습니다. 도움말 어떤 유형의 이해된다 :연결된 fasta 파일에서 각 단백질 서열의 개별적인 위치 범위를 찾는 방법

내가 좋아 단백질 FASTA 파일 (protein.txt)가 A, B 및 C 단백질의 길이임을

>a 
mnspq 
>b 
rstuvw 
>c 
mnqa 

주 5,6 및도 4는 각각 (전체 내 (

2-3 
4-10 
11-14 

각 단백질의 길이 전체 길이 = 15)

이제 I 같이) 어떤 임의의 범위를 추출 (계산은 총 길이를 기준으로 함)과 (은 File2.txt 저장 한 길이) 단백질 파일에서 볼 수 있듯이 같은 다른 파일 (file2.txt)에 저장됩니다 : 파일 1 값에서 이제

a 1-5 
b 6-11 
c 12-15 

, 나는 파일 2 값을 수정하고 위의 경우, 각 단백질 서열에 대한 개별 범위를 계산하려고 시도하는 입력, 출력 될 것입니다 : 즉

a 2-3,4-5 
b 1-5, 6 
c 2-5 

, 내가 먼저 내 모든 시퀀스을 연결하고, 연결된 파일의 일부 범위를 derermine 경우, 어떻게 각각의 단백질 서열에서 위치의 개별 범위를 찾을 수 있습니다

감사합니다

+0

'c 1-3'이 아닌가요? – choroba

+0

upps .. 내 잘못 .. 네가 절대적으로 옳다 .. –

답변

0

나는 대답의 마지막 줄 c 1-3해야 같아요

|---a---| |---b-----| |--c--| 
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 
    |-| |-----------| |-----| 
1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 

펄을 구출! 먼저 file1의 범위가 배열로 읽혀집니다. 그런 다음, file2에서 단백질을 읽고 범위와 겹치는 각 범위에 대해 "시작"및 "끝"을 계산하고 인쇄합니다.

#!/usr/bin/perl 
use warnings; 
use strict; 

my @ranges; 
open my $f1, '<', 'file1.txt' or die $!; 
while (<$f1>) { 
    chomp; 
    push @ranges, [ split /-/ ]; 
} 

open my $f2, '<', 'file2.txt' or die $!; 
while (<$f2>) { 
    my ($protein, $range) = split; 
    print "$protein"; 
    my $separator = ' '; 
    my ($from, $to) = split /-/, $range; 

    shift @ranges while @ranges && $ranges[0][1] < $from; 
    last unless @ranges; 

    while (@ranges && $ranges[0][0] <= $to) { 
     my $start = $ranges[0][0]; 
     $start = $from if $from > $start; 
     my $end = $ranges[0][1]; 
     $end = $to if $end > $to; 
     $_ -= $from - 1 for $start, $end; 

     print $separator, $start == $end ? $start : "$start-$end"; 
     $separator = ','; 

     if ($ranges[0][1] < $to) { 
      shift @ranges; 
     } else { 
      $ranges[0][0] = $to + 1; 
     } 
    } 
    print "\n"; 
}