2020 3/20 コマンド修正
リードの境目を気にせず、とにかくfastqやsamを分割したいという時は、splitコマンドが使いやすい。fastqを認識して正しく分けるならseqkit split(紹介)を使う。
--非圧縮ファイルの分割--
1000MB (1GB) ずつ分割し、gzip圧縮して保存(圧縮出力なのでそれぞれの出力は1GBよりずっと小さくなる)
split -b 1000m input output_ && gzip output_*
#pigzを使う。ここでは16スレッド指定。8GBずつ分割。
split -b 8000m input output_ && pigz -p 12 output_*
非圧縮出力で良いなら、&&の手前まででOK。
--gzファイルの分割--
1000Mbずつ分割し、gzip圧縮して保存。解凍してからsplitに渡している。
#mac osx (linuxマシンならzcat)
gzcat input_file.gz |split -b 1000m - output_ && gzip output_*
#pigzを使う。
gzcat input_file.gz |split -b 1000m - output_ && pigz -p 16 output_*
splitコマンドは単純に等分に分けているだけなので、分割したファイルを解析に使ってはならない。使う際は、コンカテネートして元に戻す必要がある。
再合体
分割されたファイルの再コンカテネートはcatを使う。
cat output_* > merged
gzippingファイルのコンカテネートもcatを使う。
bamにしてからマージするならsamtoolsを使う(merge)。
ファイルのチェック
破損がないか、ファイルをチェックする。
1、fastq(FastQValidatorでfastqデータを検証する)
fastQValidator --file input.fastq
2、bam(sam/bamファイルを変換、編集したり分析する)
bamutils check input.bam
時間測定
1、10GBのfastqを1GBずつに分割してgz保存。timeをつけてランタイムも計測。
#非圧縮fastq
time split -b 1000m input.fastq output_ && gzip output_*
分割にかかった時間は10.3秒だったが、そこからgzip圧縮するのに10分近くかかった。
2、上記のファイルをgz圧縮して、gzファイルの分割、gz出力にかかる時間を計測。
#gz圧縮fastq
time gzcat input_file.gz |split -b 1000m - output_ && gzip output_*
ファイルサイズが2.8GBのgzファイルの分割にかかった時間は34秒だった。ただしそこからgzip圧縮出力には1のケースと同じくらいの時間がかかった。
追記
急ぎなら並列動作するpigzなどの圧縮器を使う。gzcatがないならzcatで
zcat input_file.gz |split -b 1000m - output_ && pigz -p 8 output_*
もしリード単位の分割を行うならfastq splitter(リンク)を使うか、もしくはスクリプトを書く。
Multi=fastaをヘッダーごとに分割したいならBBtoolsを使う。
bamの分割
引用
Question: Split Fastq Files Into Chunks Of 1M Reads
https://www.biostars.org/p/10756/
How to split a file and compress directly?
https://serverfault.com/questions/598647/how-to-split-a-file-and-compress-directly
gzip 圧縮したテキストファイルは cat でつなげても大丈夫だよ - Qiita