특정 연속 문자, 발생 위치 및 길이 계산

특정 연속 문자, 발생 위치 및 길이 계산

시퀀스 파일이 있고 연속 문자 "N"의 개수와 해당 문자의 발생 위치 및 길이를 계산하려고 합니다. mySequence.fasta파일 이름은 다음과 같습니다.

>sequence-1
ATCGCTAGCATNNNNNNNNNNNNNNCTAGCATCATGCNNNNNNATACGCATCACANNNNNNNNNCgcatATCAC

예상 출력은 다음과 같아야 합니다.

Position 12 N 14
Position 38 N 6
Position 56 N 9

awksed내 파일 이름을 제공 하거나 제공하여 이 문제를 해결하도록 도와주세요.mySequence.fasta

답변1

이에 매우 유용한 awk설정 match()RSTART변수를 사용하여 이 작업을 수행할 수 있습니다 .RLENGTH

<mySequence.fasta awk -v C=N '{
  i=0
  while (match($0, C "+")) {
    printf "Position %d %s %d\n", i+RSTART, C, RLENGTH
    i += RSTART+RLENGTH-1
    $0 = substr($0, RSTART+RLENGTH)
  }}'

또는 및 배열을 perl사용하여 경기의 시작과 끝을 기록합니다.@-@+

perl -ne 'printf "Position %d N %d\n", $-[0]+1, $+[0]-$-[0] while /N+/g'

약간 더 빠른 또 다른 방법(적어도 내 버전에서는 perl) perl은 (실험적인) (?{...})정규식 연산자:

perl -ne '0 while /N(?{$s=pos})N*(?{printf "Position %d N %s\n", $s, pos()-$s+1})/g'

답변2

또 다른 awk해결책:

awk -F '' '{for(i=1;i<=NF;i++){ if($i=="N"&&!sPOS) sPOS=i;
   if (i==NF &&sPOS && $NF=="N"){LN++}; if($i=="N" &&sPOS && i<NF) {LN++}
   else if(sPOS) {printf("Position %d N %d\n", sPOS, LN); LN=sPOS=0} }
}' infile.txt

모든 awk구현은 빈 FS( )를 지원하지 않으므로 -F ''호환성을 위해 수정된 스크립트는 다음과 같습니다.

awk -F'N' '{sPOS=0;for(i=2;i<=NF;i++){ if($i==""&&!sPOS) sPOS=(i-1)+length($(i-1));
    if($i=="" &&sPOS && NF!=i) {LN++} 
    else if(sPOS) {printf("Position %d N %d\n", sPOS, ++LN); sPOS+=LN+length($i); LN=0} }
}' infile.txt

입력 예:

>sequence-1
ATCGCTAGCATNNNNNNNNNNNNNNCTAGCATCATGCNNNNNNATACGCATCACANNNNNNNNNCgcatATCACNN
N
AN
NNA

결과 :

Position 12 N 14
Position 38 N 6
Position 56 N 9
Position 75 N 2
Position 1 N 1
Position 2 N 1
Position 1 N 2

관련 정보