fasta 파일을 해독하는 awk 공식 이해

fasta 파일을 해독하는 awk 공식 이해

방금 fasta 파일의 압축을 푸는 데 사용할 수 있는 공식을 찾았습니다. 공식을 제시하기 전에 fasta 파일 압축 풀기가 무엇인지 설명해야 합니다. 즉, fasta 형식은 다음과 같습니다.

>name_of_sequence$
xxxxxxxxxxxxxxxxxxxxxx$
>name_of_sequence_2$
xxxxxxxxxxxxxxxxxxxxxx$
>name_of_sequence_3$
xxxxxxxxxxxxxxxxxxxxxx$

시퀀스당 한 줄(xxxxxx...)만 있기 때문에 이것은 일반적인 fasta 파일입니다. 달러 기호는 개행 문자입니다.

하지만 가끔은, 당신은 찾을 것입니다fasta 파일은 다음과 같습니다.

>name_of_sequence$
xxxxxxxxx$
xxxxxxxxx$
xxxx$
>name_of_sequence_2$
xxxxxxxxx$
xxxxxxxxx$
xxxx$
>name_of_sequence_3$
xxxxxxxxx$
xxxxxxxxx$
xxxx$

여기에는 여전히 세 개의 시퀀스만 있지만 각 시퀀스는 세 부분으로 나뉩니다. fasta 파일의 압축을 푼다는 것은 후자 형식을 전자 형식(시퀀스당 한 줄)으로 변환하는 것을 의미합니다.

이렇게 하려면 후자 파일에서 개행 문자를 제거해야 하지만 전부는 아닙니다. 시퀀스 이름 뒤(예: >name_of_sequence$)와 시퀀스 끝(예: xxxx$)에 줄 바꿈을 유지해야 합니다.

수식은 다음과 같습니다.

cat infasta | awk '/^>/{print s? s"\n"$0:$0;s="";next}{s=s sprintf("%s",$0)}END{if(s)print s}' > outfasta

내 질문은: 누군가 나에게 그것이 어떻게 작동하는지 설명해 줄 수 있습니까?

답변1

이것은 귀하의 awk스크립트입니다:

/^>/ {
    print s ? s "\n" $0 : $0;
    s = "";
    next;
}

{
    s = s sprintf("%s", $0);
}

END {
    if (s)
      print s;
}

>첫 번째 블록은 행이 (즉, fasta 헤더 행)으로 시작하는 경우에만 트리거됩니다.

첫 번째 블록에는 무언가가 인쇄됩니다. 그건 s ? s "\n" $0 : $0. 이는 " s0이 아닌 경우(또는 설정되지 않은 경우) s개행 문자를 사용하고 추가한 다음 현재 줄 전체를 추가하고, 그렇지 않으면 현재 줄 전체를 사용함"을 의미합니다. 이 프로그램에서는 s가장 최근에 처리된 헤더 행에 속하는 부분 읽기 시퀀스가 ​​되며 프로그램이 헤더 행에 도달하면 이 print명령문은 마지막 시퀀스(현재 완료된)를 출력하고 새로 발견된 헤더가 뒤따릅니다. 새로운 회선에 있습니다.

그런 다음 블록은 s빈 문자열로 설정되고(아직 이 헤더에 속하는 시퀀스를 읽지 않았습니다) 다음 입력 라인으로 점프합니다.

next다음 블록은 모든 입력 행에 대해 실행됩니다(단 , 이전 블록의 입력 행으로 인해 건너뛰기 때문에 헤더 행에 대해서는 실행되지 않습니다 ). 현재 행을 사용된 s. 에 추가 sprintf하지만 이유는 잘 모르겠습니다( s = s $0작동할 수도 있음).

모든 입력 라인을 읽은 후 마지막 블록이 실행됩니다. 마지막 헤더 행(있는 경우)에 속하는 시퀀스를 인쇄합니다.

요약:

스크립트 awk는 모든 개별 시퀀스 라인을 변수에 저장하여 연결합니다. 헤더 행이 발견되면 지금까지 읽은 시퀀스를 자체 라인의 새 헤더와 함께 출력합니다. 마지막으로 마지막 헤더에 속하는 시퀀스가 ​​출력됩니다.


awk변수에 시퀀스를 저장하지 않는 대체 스크립트(fasta 파일에 매우 큰 게놈이 있는 경우 유용할 수 있음):

/^>/ {
    if (NR == 1) {
        print;  # 1st header line, just print it.
    } else {
        # Print a newline for the prev. sequence, then the header line on its own line.
        printf("\n%s\n", $0);
    }
    next; # Skip to next input line.
}

{
    printf("%s", $0); # Print sequence without newline.
}

END {
    printf("\n"); # Add final newline to output.
}

"한 줄"로:

awk '/^>/{if(NR==1){print}else{printf("\n%s\n",$0)}next} {printf("%s",$0)} END{printf("\n")}' sequence.fasta

답변2

FWIW fasta 파일을 래핑하기 위한 "sed" 기반 솔루션이 있습니다. sed 메소드의 기본 흐름은 시퀀스 이름 라인을 찾은 후 먼저 해당 라인을 자체적으로 표시한 다음 시퀀스 라인을 패턴 공간 자체에 축적하기 시작하고 동시에 개행을 제거하는 것입니다. 이 흐름은 다음 시퀀스 이름 줄이나 eof에 도달하면 중단됩니다.

sed -e '
  /^>/{                  # caught sequence name line
     n                   # print seq name, next line into pattern space
     :loop
        N                # read next line into PS, if not print PS/quit
        /\n>/!s/\n//     # join successive sequences
     /\n/!bloop          # go back for more seq if new seq name not got yet
     P;D                 # print the current seq then delete it, branch to the top with PS having new seq name
  }
' your_fasta_file

관련 정보