Linux - 特定の文字と繰り返し数に基づいて大容量ファイルを小さなファイルに分割する

Linux - 特定の文字と繰り返し数に基づいて大容量ファイルを小さなファイルに分割する

次のような非常に大きなファイルがあります。

>name1
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
>name2
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
>name
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
>name4
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT
ACGTACGTACGT

これはfastaファイルです。 (3183名)で始まり、約3183行があり、>その後に任意の数のACGT行が続きます。>250秒後にACGT行数を追加する小さなファイルに分割したいと思います。最後のファイルの長さが250秒でなくても構いません>。私はまだそれを守りたいです。これまで分割しようとしましたが、ファイルを>各小さなファイルの1つに分割するので、ここでは適切ではないと思います。私もawkを試しました:

awk -F'>' 'NR==1{f=0;c=1}NR>1{
c++
if($((c%250))==0) {
fn="file"c".fasta";
print > fn}
}' kmer_subtraction/kmercollection.fasta

私のファイルを見ることができないので、これがうまくいくかどうかわかりません。この問題を解決するのに役立ちますか?ありがとうございます!

答え1

awkを使用してください。

awk '
    />/ { if ( (++c % 250) == 1 ) { close(fn); fn="file"(++n)".fasta" } }
    { print > fn }
' file.fasta

答え2

私は、数年前に同僚がfasta形式と「テーブル」形式の間で変換するシンプルで強力なawkスクリプトのいくつかを保持しています。 「表形式」形式が意味するのは、fastaファイルを最初のタブ区切りフィールドとしてシーケンス識別子を使用し、2番目のフィールドにシーケンス識別子を使用して1行に1つの項目に変換することです。

スクリプトを見つけることができます ここ

表形式は分割に適しているため、これを使用して目的の操作を簡単に実行できます。

FastaToTbl file.fa > file.tbl
split -l 250 file.tbl file.subseq 

これは入力ファスタファイルをインポートし、、、...、file.faという名前の1行に1つずつ250のシーケンスを含むN個のファイルを生成します。これでfastaに戻ります。file.subseqaafile.subseqabfile.subseqaz

for file in file.subseq*; do
    TblToFasta "$file" > "$file.fa"
    rm  "$file"
done
rm file.tbl

別のファスタファイルがあり、中間テーブル形式ファイルが削除されました。


このタスクを一度に実行するために独自の小さなスクリプトを作成することもできます。

gawk -v n=1 '{ if(/^>/){k++; if(k % 250 == 0){n++; }} print > "file."n".fa"; }' file.fa  

GNU awkを使用しないと、開いているファイルが多すぎるという文句が出ることがあります。

最後に、シェルとawk構文を混同したため、スクリプトは機能しません。これはシェル構文です。 awkでは、上で行ったように使用するだけ$((c%250))です。if( c % 250 == 0)

関連情報