私は現在、スキャフォールディングを含む大容量ファスタファイル(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
実際には合計3714529
10個のファイルがあり、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
して実行可能にします。