足場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 一意の識別子

おすすめ記事