膨大な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