스캐폴딩 ID 및 시퀀스를 존중하여 스캐폴딩이 있는 fasta 파일을 동일한 길이의 파일로 분할합니다.

스캐폴딩 ID 및 시퀀스를 존중하여 스캐폴딩이 있는 fasta 파일을 동일한 길이의 파일로 분할합니다.

나는 현재 스캐폴딩이 포함된 대용량 fasta 파일(3.7GB)을 작업 중입니다. 각 비계에는 첫 번째 행부터 시작하여 고유한 식별자가 있으며 >, 연속 행에는 다음과 같은 DNA 서열이 있습니다.

>9999992:0-108
AAAGAATTGTATTCCCTCCAGGTAGGGGGGATAGTTGAGGGGATACATAG
TGGGAAGGCTTTTCATGCGGAGGGACTAGAATGTGCTCCCGACTGACAAA
GCAGCTTG
>9999993:0-118
AGGGACTAGAAATGAGATTAAAAAGAGTAAAAGCACTGATACAAGTACAA
AAACAAATTGCTTCACCTCCAAAACCCCAGAAACTGCCCCACTTGGCTCC
CATTTAACCTACCTTCAA
>9999994:0-113
CCATCCTCATCCTTTCCTCCCCATATCTTCCTCTGACCCCAAAGCTCAGG
TTTCCTGTCTTGTTTCCCAGAATCTGTACCTCATGGTAGTTAAACCTTCC
CCTCTGGCAGCCA
>9999997:0-87
AACATCCCTGTGGCCTGAGAGACTGCCAGCCACAGCGGTGACAGTCCCTG
CGAGAGGCTGCTGCAAAAAGACTGGAGAGAAAGCAGA
>9999998:0-100
AAACATCAGCGCCAAGTCCCCGAAACCAGCAGGGTCACTGGGCGGCCGGC
CTGAAATACCCCAGCAGGCCAGCAGTGCCGGGTGCCTGGGGAGGTGTCCT
>9999999:0-94
AAGAAACTTTTCCCTTAACCAATGAAGAGTTTTATGTAAAGGAAATTTAG
TAATTTTTTAAAAAATGGTAATGACAGATTTAAGTAATTTAATT

파일을 동일한 길이의 더 작은 파일로 분할하여 처리하고 싶지만 ID와 시퀀스를 모두 존중하여 다음과 같은 결과를 얻어야 합니다.

file1.fa
>9999992:0-108
AAAGAATTGTATTCCCTCCAGGTAGGGGGGATAGTTGAGGGGATACATAG
TGGGAAGGCTTTTCATGCGGAGGGACTAGAATGTGCTCCCGACTGACAAA
GCAGCTTG
>9999993:0-118
AGGGACTAGAAATGAGATTAAAAAGAGTAAAAGCACTGATACAAGTACAA
AAACAAATTGCTTCACCTCCAAAACCCCAGAAACTGCCCCACTTGGCTCC
CATTTAACCTACCTTCAA

file2.fasta
>9999994:0-113
CCATCCTCATCCTTTCCTCCCCATATCTTCCTCTGACCCCAAAGCTCAGG
TTTCCTGTCTTGTTTCCCAGAATCTGTACCTCATGGTAGTTAAACCTTCC
CCTCTGGCAGCCA
>9999997:0-87
AACATCCCTGTGGCCTGAGAGACTGCCAGCCACAGCGGTGACAGTCCCTG
CGAGAGGCTGCTGCAAAAAGACTGGAGAGAAAGCAGA

file3.fasta
>9999998:0-100
AAACATCAGCGCCAAGTCCCCGAAACCAGCAGGGTCACTGGGCGGCCGGC
CTGAAATACCCCAGCAGGCCAGCAGTGCCGGGTGCCTGGGGAGGTGTCCT
>9999999:0-94
AAGAAACTTTTCCCTTAACCAATGAAGAGTTTTATGTAAAGGAAATTTAG
TAATTTTTTAAAAAATGGTAATGACAGATTTAAGTAATTTAATT

도와주세요. grep을 사용해 보았 csplit으나 잘못된 결과가 나왔습니다.

답변1

아래 코드는 도움이 될 수 있지만 컴퓨터 사양에 따라 대용량 파일의 경우 속도가 느려질 수 있습니다.

첫째, 당신이 얻어야 할 총 개수입니다 Unique Identifier. 다음을 사용하여 이를 달성할 수 있습니다.grep -c

total=$(grep -c "^>" largeFastaFile.txt)

위의 코드는 total로 시작하는 일치하는 줄의 개수를 변수에 할당합니다 >. 이제 Unique Identifier각 파일의 번호를 얻어야 합니다 . 그러니 갖고 싶다면10개 파일. 당신은 나누어야합니다 total/10:

max=$((total/10))
#If total has 3714529 then max will have 371,452.

마지막으로 awk다음 명령을 사용하여 대용량 파일을 10개의 파일로 분할할 수 있습니다(실제로 11) 에 대한371,452개의 고유 식별자각 파일:

awk -v maxline=$max -v count=0\ 
 '{if(NR>1) { if( (NR-2)%maxline == 0 ) count++ ; print ">"$0 >("file"count".fasta")  } }'\
 RS='>' largeFastaFile.txt

스크립트는 다음과 같아야 합니다.

#!/bin/bash

total=$(grep -c "^>" largeFastaFile.txt)
max=$((total/10)) # where 10 is the number of files you will get

awk -v maxline=$max -v count=0 '{if(NR>1) { if( (NR-2)%maxline == 0 ) count++ ; print ">"$0 >("file"count".fasta")  } }' RS='>' largeFastaFile.txt

실제로 총 371452910개의 파일이 있고 371,452 Unique Identifier각 파일의 수가 동일하면 다른 파일에 여러 줄이 있어야 하므로 실제로 11개의 파일을 얻게 됩니다.

371,452 * 10 = 3,714,520

그래서번호 11파일은 마지막9 고유 식별자

답변2

나는 fasta와 tbl(시퀀스 식별자, TAB, 단일 라인 시퀀스) 형식 사이를 변환하기 위해 몇 년 전에 옛 동료가 작성한 스크립트 몇 개를 사용해 왔습니다. 스크립트를 게시했습니다.여기. 이를 사용하면 파일을 한 줄당 시퀀스로 쉽게 변환한 다음 분할하여 각 파일에 원하는 줄 수를 지정한 다음 분할 파일을 다시 fasta로 변환할 수 있습니다.

FastaToTbl file.fa | split -l 2 - splitFile

샘플 입력을 사용하여 다음 파일을 만듭니다.

$ for f in splitFile*; do printf "\n===== File: %s ====\n" "$f"; cat "$f"; done

===== File: splitFileaa ====
9999992:0-108   AAAGAATTGTATTCCCTCCAGGTAGGGGGGATAGTTGAGGGGATACATAGTGGGAAGGCTTTTCATGCGGAGGGACTAGAATGTGCTCCCGACTGACAAAGCAGCTTG
9999993:0-118   AGGGACTAGAAATGAGATTAAAAAGAGTAAAAGCACTGATACAAGTACAAAAACAAATTGCTTCACCTCCAAAACCCCAGAAACTGCCCCACTTGGCTCCCATTTAACCTACCTTCAA

===== File: splitFileab ====
9999994:0-113   CCATCCTCATCCTTTCCTCCCCATATCTTCCTCTGACCCCAAAGCTCAGGTTTCCTGTCTTGTTTCCCAGAATCTGTACCTCATGGTAGTTAAACCTTCCCCTCTGGCAGCCA
9999997:0-87    AACATCCCTGTGGCCTGAGAGACTGCCAGCCACAGCGGTGACAGTCCCTGCGAGAGGCTGCTGCAAAAAGACTGGAGAGAAAGCAGA

===== File: splitFileac ====
9999998:0-100   AAACATCAGCGCCAAGTCCCCGAAACCAGCAGGGTCACTGGGCGGCCGGCCTGAAATACCCCAGCAGGCCAGCAGTGCCGGGTGCCTGGGGAGGTGTCCT
9999999:0-94    AAGAAACTTTTCCCTTAACCAATGAAGAGTTTTATGTAAAGGAAATTTAGTAATTTTTTAAAAAATGGTAATGACAGATTTAAGTAATTTAATT

-l 2각 파일을 원하는 시퀀스 수로 변경합니다. 그런 다음 분할된 파일을 반복하여 각각을 fasta로 변환합니다.

c=0
for f in splitFile*; do 
    outFile=file.$((++c)).fa
    TblToFasta "$f" > "$outFile"
done

그러면 다음 파일이 생성됩니다.

$ for f in file.*.fa; do printf "\n===== File: %s ====\n" "$f"; cat "$f"; done

===== File: file.1.fa ====
>9999992:0-108 
AAAGAATTGTATTCCCTCCAGGTAGGGGGGATAGTTGAGGGGATACATAGTGGGAAGGCT
TTTCATGCGGAGGGACTAGAATGTGCTCCCGACTGACAAAGCAGCTTG
>9999993:0-118 
AGGGACTAGAAATGAGATTAAAAAGAGTAAAAGCACTGATACAAGTACAAAAACAAATTG
CTTCACCTCCAAAACCCCAGAAACTGCCCCACTTGGCTCCCATTTAACCTACCTTCAA

===== File: file.2.fa ====
>9999994:0-113 
CCATCCTCATCCTTTCCTCCCCATATCTTCCTCTGACCCCAAAGCTCAGGTTTCCTGTCT
TGTTTCCCAGAATCTGTACCTCATGGTAGTTAAACCTTCCCCTCTGGCAGCCA
>9999997:0-87 
AACATCCCTGTGGCCTGAGAGACTGCCAGCCACAGCGGTGACAGTCCCTGCGAGAGGCTG
CTGCAAAAAGACTGGAGAGAAAGCAGA

===== File: file.3.fa ====
>9999998:0-100 
AAACATCAGCGCCAAGTCCCCGAAACCAGCAGGGTCACTGGGCGGCCGGCCTGAAATACC
CCAGCAGGCCAGCAGTGCCGGGTGCCTGGGGAGGTGTCCT
>9999999:0-94 
AAGAAACTTTTCCCTTAACCAATGAAGAGTTTTATGTAAAGGAAATTTAGTAATTTTTTA
AAAAATGGTAATGACAGATTTAAGTAATTTAATT

사용되는 두 가지 스크립트는 다음과 같습니다.

  • Tbl을 빠르게 변환하세요

      #!/usr/bin/awk -f
      {
              if (substr($1,1,1)==">")
              if (NR>1)
                          printf "\n%s\t", substr($0,2,length($0)-1)
              else 
                  printf "%s\t", substr($0,2,length($0)-1)
              else 
                      printf "%s", $0
      }END{printf "\n"}
    
  • TblToFasta

      #! /usr/bin/awk -f
      {
        sequence=$NF
    
        ls = length(sequence)
        is = 1
        fld  = 1
        while (fld < NF)
        {
           if (fld == 1){printf ">"}
           printf "%s " , $fld
    
           if (fld == NF-1)
            {
              printf "\n"
            }
            fld = fld+1
        }
        while (is <= ls)
        {
          printf "%s\n", substr(sequence,is,60)
          is=is+60
        }
      }
    

파일에 저장 $PATH하고 실행 가능하게 만듭니다.

관련 정보