足場IDとシーケンスを尊重し、足場があるfastaファイルを同じ長さのファイルに分割します。

足場IDとシーケンスを尊重し、足場があるfastaファイルを同じ長さのファイルに分割します。

私は現在、スキャフォールディングを含む大容量ファスタファイル(3.7 GB)で作業しています。各足場には最初の行から始まる固有の識別子があり>、連続行には次のような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、単一行シーケンス)形式の間で変換するために、数年前に古い同僚によって書かれたいくつかのスクリプトを使用してきました。スクリプトを公開しました。ここ。これにより、ファイルを1行あたりのシーケンスに簡単に変換し、分割して各ファイルに必要な行数を指定し、分割ファイルを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

使用される2つのスクリプトは次のとおりです。

  • 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して実行可能にします。

関連情報