膨大なFastaファイルを一定配列数で分割するスクリプト
学生の練習問題的な感じですが,作ったのでメモを残しておきます.
以下の様にすると,input.fasta内の配列を1000本ずつに分けて,input.0001.fasta, input.0002.fasta,... というファイルに保存します.
ruby seq_split.rb input.fasta
オプションは
-o
: 出力するディレクトリ.outdir下にファイルを出力します(予め作っておいてください).デフォルトはカレントディレクトリ.
-d: ファイル名に振る番号の桁数を指定.デフォルトは4.
-s: 各ファイルに保存する配列の本数を指定.2000とすると2000本ずつ分けます.デフォルトは1000
なので,
ruby seq_split.rb -o outdir -d 3 -s 2000 input.fasta
の様に使えます.
#!/usr/bin/env ruby require 'optparse' step = 1000 output_dir = "." digit = 4 opt = OptionParser.new opt.on("-d", "--digit [VALUE]", Integer){|v| digit = v.to_i} opt.on("-o", "--output_dir [VALUE]", String){|v| output_dir = v} opt.on("-s", "--step [VALUE]", Integer){|v| step = v.to_i} opt.parse!(ARGV) filename = ARGV[0] prefix = "" suffix = "" if filename =~ /^(.+)\.([^\.]+)$/ prefix = $1 suffix = $2 end fp = open(filename, "r") count = 0 split_num = 0 cur_filename = "" cur_fp = nil while line = fp.gets if line[0,1] == ">" if count % step == 0 STDERR.puts cur_filename cur_fp.close unless cur_fp.nil? split_num += 1 cur_filename = prefix + "." + "%0#{digit}d" % split_num + "." + suffix cur_fp = open(output_dir + "/" + cur_filename, "w") count = 0 end count += 1 end cur_fp.print line end STDERR.puts cur_filename cur_fp.close