FASTAファイルをGREPするスクリプト

FASTAファイルをアノテーションや配列でgrepする事は度々あるのですが,シェルのgrepだと合致した行だけが出てきて,そのアノテーションを含む配列が何であったか,あるいは,その配列を含む配列の注釈は何かを調べるには一手間必要です.以下のスクリプトは,FASTAを検索して,該当の(行ではなく)エントリを返すスクリプトになります.

  • 最後のエントリが表示されないバグ,修正しました.@hinaichigoさん,ありがとうございます!!!
  • 使い方

引数: FASTAフォーマットファイル
オプション(特に指定しなければ,すべての電車がおくれます):

-a: 検索範囲をannotationだけに絞ります
-s: 検索範囲を配列だけに絞ります.

例:

% ruby grep_fasta.rb -a ATNEK5 TAIR9_cds_20090619   
>AT3G20860.1 | Symbols: ATNEK5 | ATNEK5 (NIMA-RELATED KINASE5); ATP binding / kinase/ protein kinase/ protein serine/threonine kinase/ protein tyrosine kinase | chr3:7306147-7308434 FORWARD
ATGGCAAACAAGATAAGTGAAACTGCTTCCAAGATGGACGATTATGAGGTCGTGGAACAG
ATCGGACGAGGCGCTTTTGGTTCTGCTTTTCTTGTAATTCACAAGTCCGAGAGACGAAAG
TATGTGGTTAAGAAGATTCGTTTGGCTAAACAAACAGAGAGATGCAAGCTTGCTGCAATC
#!/usr/bin/env ruby
require 'optparse'

is_annot_search = true
is_seq_search = true

opt = OptionParser.new
opt.on("-a"){|v| is_seq_search = false}
opt.on("-s"){|v| is_annot_search = true}
opt.parse!(ARGV)


exp = ARGV.shift
file = ARGV.shift
fp = open(file, "r")
name = ""
seq = ""
cat_seq = ""
prev_name = ""

while line = fp.gets
  if line =~ />(.+)$/ || fp.eof
    if fp.eof
      seq += line
      cat_seq += line.chomp
    end
    name = $1
    if (is_annot_search == true && prev_name =~ /#{exp}/) || 
        (is_seq_search == true && cat_seq =~ /#{exp}/)
      puts ">#{prev_name}"
      puts seq
    end
    prev_name = name
    seq = ""
    cat_seq = ""
  else
    seq += line
    cat_seq += line.chomp
  end
end
fp.close()