그래서 저는 다음과 같은 fasta(생물학) 파일을 가지고 있습니다:
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCAGAACACCTGGTTTCACGACC
ATAAATAATTTACCAGTGAATCGAGGCTCAATTATAGATCCTCGGACGCGAGTTCTCGGTTGACGAGTGG
GATTCGAATTATTTTTCACCGAAAATTTTAGTCGACGAGTTCAGATAAATTTGTTCGGGATAAAATCATC
TGAGTAGGTCGGGCTTCTGAATTTCGTATTCTTGCGAGCAATGAATTTTAAATAATCATCGGACATACCA
ATTTTTGGAACAATAATGTTCCGAACATCCCGAAAATATAGGAAGAGCCCGGATAGATAAAAATAAACAC
각 줄의 길이는 최대 70자까지 가능합니다. 일반적으로 최대 50자 길이로 형식을 지정하려면 다음을 사용합니다.
Fold -50 input.fasta > output.fasta # -b 및 -w args도 시도함
그러나 어떻게 든 이것은 작동하지 않습니다. 파일은 내가 본 다른 많은 파일과 똑같아 보입니다. 이제 출력은 다음과 같습니다.
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCA
GAACACCTGGTTTCACGACC
ATAAATAATTTACCAGTGAATCGAGGCTCAATTATAGATCCTCGGACGCG
AGTTCTCGGTTGACGAGTGG
GATTCGAATTATTTTTCACCGAAAATTTTAGTCGACGAGTTCAGATAAAT
TTGTTCGGGATAAAATCATC
TGAGTAGGTCGGGCTTCTGAATTTCGTATTCTTGCGAGCAATGAATTTTA
AATAATCATCGGACATACCA
ATTTTTGGAACAATAATGTTCCGAACATCCCGAAAATATAGGAAGAGCCC
돌출된 20자를 잘라서 아래에 올바르게 배치하지만 다음 줄에 연결되지 않고 최대 50자로 줄입니다.
이전에 생성된 fasta 파일로 돌아갔지만 접기 명령은 여전히 잘 작동했습니다. 새 파일의 일부를 복사하여 다른 파일에 붙여넣어도 문제가 지속됩니다.
제가 모르는 인코딩 문제가 있는 것 같습니다. 누구든지 도와줄 수 있나요?
건배,
편집: 좋은 답변입니다. 감사합니다!
답변1
귀하의 문제는 파일 인코딩과 관련이 없습니다. 이 fold
유틸리티는 매우 원시적이며 특정 길이의 줄을 끊지만 연결하지는 않습니다.
fasta 헤더 행을 보존하기 위해 주의할 수도 있습니다(즉, 축소하지 마십시오).
awk -v W=50 '
/^>/ { if (seq != "") print seq; print; seq = ""; next }
{
seq = seq $1
while (length(seq) > W) {
print substr(seq, 1,W)
seq = substr(seq, 1+W)
}
}
END { if (seq != "") print seq }' file.fa
이 awk
명령은 헤더 행을 변경하지 않은 채 시퀀스를 50자로 다시 포맷합니다. 너비 50은 W
변수를 통해 조정 가능하며 양의 정수로 설정할 수 있습니다.
코드의 첫 번째 블록은 헤더 행을 처리하고 이전 시퀀스에서 누적된 시퀀스 비트(출력할 것이 남아 있는 경우)를 출력한 다음 수정되지 않은 헤더 행을 출력에 전달합니다.
두 번째 블록은 일련의 행을 누적하고, 누적된 시퀀스가 충분히 길면 누적된 시퀀스를 적절한 청크로 출력할 수 있습니다.
마지막 블록( END
)은 입력 끝에 도달하면 나머지 시퀀스를 출력합니다.
시퀀스의 두 복사본이 포함된 파일에 대해 이 명령을 실행하면
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCA
GAACACCTGGTTTCACGACCATAAATAATTTACCAGTGAATCGAGGCTCA
ATTATAGATCCTCGGACGCGAGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGTTCAGATAAATTTGTTCGGGA
TAAAATCATCTGAGTAGGTCGGGCTTCTGAATTTCGTATTCTTGCGAGCA
ATGAATTTTAAATAATCATCGGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCCGGATAGATAAAAATAAACAC
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCA
GAACACCTGGTTTCACGACCATAAATAATTTACCAGTGAATCGAGGCTCA
ATTATAGATCCTCGGACGCGAGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGTTCAGATAAATTTGTTCGGGA
TAAAATCATCTGAGTAGGTCGGGCTTCTGAATTTCGTATTCTTGCGAGCA
ATGAATTTTAAATAATCATCGGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCCGGATAGATAAAAATAAACAC
W
30으로 변경 하면
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATC
AAATAATTTCATTCGCGTCAGAACACCTGG
TTTCACGACCATAAATAATTTACCAGTGAA
TCGAGGCTCAATTATAGATCCTCGGACGCG
AGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGT
TCAGATAAATTTGTTCGGGATAAAATCATC
TGAGTAGGTCGGGCTTCTGAATTTCGTATT
CTTGCGAGCAATGAATTTTAAATAATCATC
GGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCC
GGATAGATAAAAATAAACAC
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATC
AAATAATTTCATTCGCGTCAGAACACCTGG
TTTCACGACCATAAATAATTTACCAGTGAA
TCGAGGCTCAATTATAGATCCTCGGACGCG
AGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGT
TCAGATAAATTTGTTCGGGATAAAATCATC
TGAGTAGGTCGGGCTTCTGAATTTCGTATT
CTTGCGAGCAATGAATTTTAAATAATCATC
GGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCC
GGATAGATAAAAATAAACAC
당신도 옳을 수도 있습니다. . . 관심이 있다FASTX 툴킷CSHL에서. 나는 이것을 직접 사용한 적이 없지만 "FASTA 포맷터(FASTA 파일의 시퀀스 라인 너비 변경)"가 포함된 것 같습니다. 이러한 도구의 최신 버전은 2014년(아주 오래된 버전)이므로 특정 Unix 배포판에서 패키지를 제공하지 않는 한(패키지 저장소 확인) 제공된 미리 컴파일된 바이너리 중 하나를 사용하는 대신 소스에서 직접 컴파일하는 것이 좋습니다.
답변2
이 시도:
<input.fasta tr -d '\n'|fold -w 50 >output.fasta
이렇게 하면 tr
기존 줄 끝이 제거되고 결과 단일 줄이 최대 길이가 50인 여러 줄로 형식화됩니다.
첫 번째 줄을 현재 길이로 유지하고 후속 줄과 결합하지 않으려면 다음과 같이 하면 됩니다(그리고 줄의 끝으로 출력이 종료됩니다).
awk '{if (NR==1) {print $0 gensub(/ /, " ", "g", sprintf("%*s", 50-length($0), ""))} else print $0}' input.fasta|tr -d '\n'|sed '$s/$/\n/'|fold -w 50|awk '{$1=$1};1' >output.fasta
답변3
이것이 fold
작동하는 방식입니다. 이전에는 이렇게 긴 줄이 없었기 때문에 한번도 씨를 뿌려 본 적이 없습니다. 접기는 각 줄에서 개별적으로 발생합니다. 따라서 선의 길이가 접으려는 크기의 정확한 배수가 아닌 경우 이 출력을 얻게 됩니다. 예를 들어:
$ perl -le 'for (0..2){print "A" x 12}'
AAAAAAAAAAAA
AAAAAAAAAAAA
AAAAAAAAAAAA
$ perl -le 'for (0..2){print "A" x 12}' | fold -w 6
AAAAAA
AAAAAA
AAAAAA
AAAAAA
AAAAAA
AAAAAA
$ perl -le 'for (0..2){print "A" x 12}' | fold -w 7
AAAAAAA
AAAAA
AAAAAAA
AAAAA
AAAAAAA
AAAAA
이제 이것은 실제로 문제가 되지 않습니다. 이것은 여전히 유효한 fasta 파일이지만 예쁘지는 않습니다. 해결 방법으로 채택 FastaToTbl
하고 TblToFasta
스크립팅 할 수 있습니다.예전에 포스팅한 적이 있어요그리고 다음을 수행하십시오:
$ FastaToTbl input.fasta | TblToFasta
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCAGAACACCTGG
TTTCACGACCATAAATAATTTACCAGTGAATCGAGGCTCAATTATAGATCCTCGGACGCG
AGTTCTCGGTTGACGAGTGGGATTCGAATTATTTTTCACCGAAAATTTTAGTCGACGAGT
TCAGATAAATTTGTTCGGGATAAAATCATCTGAGTAGGTCGGGCTTCTGAATTTCGTATT
CTTGCGAGCAATGAATTTTAAATAATCATCGGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCCGGATAGATAAAAATAAACAC
이 TblToFasta
스크립트는 출력이 라인당 표준 60bp인지 확인합니다. 정말로 50개가 필요하다면 다음과 같이 할 수 있습니다(GNU 가정 sed
):
$ FastaToTbl input.fasta | sed -E 's/^/>/;s/\t/\n/ ' | sed -E 's/(.{50})/\1\n/g'
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCA
GAACACCTGGTTTCACGACCATAAATAATTTACCAGTGAATCGAGGCTCA
ATTATAGATCCTCGGACGCGAGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGTTCAGATAAATTTGTTCGGGA
TAAAATCATCTGAGTAGGTCGGGCTTCTGAATTTCGTATTCTTGCGAGCA
ATGAATTTTAAATAATCATCGGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCCGGATAGATAAAAATAAACAC