#!/usr/bin/env ruby require 'rbbt-util' require 'rbbt/util/simpleopt' options = SOPT.setup < [] Use - to read from STDIN, 'key' can be the key string or a number representing its position. If not specified 'key' defaults to 0, the first entry. -tch--tokyocabinet File is a tokyocabinet hash database -tcb--tokyocabinet_bd File is a tokyocabinet B database -f--fields* Fields to extract -s--sep* Separation character -hh--header_hash* Change the character used to mark the header line (defaults to #) -k--key_field* Use this field as key -h--help Print this help -l--lines Separate in lines -t--type* Type of tsv EOF rbbt_usage and exit 0 if options[:help] file, key = ARGV raise ParameterException, "Please specify file" if file.nil? file = STDIN if file == '-' case when options[:tokyocabinet] tsv = Persist.open_tokyocabinet(file, false) when options[:tokyocabinet_bd] tsv = Persist.open_tokyocabinet(file, false, nil, TokyoCabinet::BDB) else if String === file file = file.dup Path.setup(File.expand_path(file)) end tsv = file end fields = options[:fields] key_field = options[:key_field] fields = fields.split(/[,|]/, -1) unless fields.nil? if TSV === tsv case key when nil key = tsv.keys.first if key.nil? when /^\d+$/ key = tsv.keys[key.to_i] unless tsv.include?(key) end v = tsv[key] fields ||= tsv.fields puts Log.color(:blue, "Key: #{ key }") if fields if fields.length == 1 if options[:lines] puts (Array === v ? v.flatten*"\n" : v.to_s ) else puts (Array === v ? v.flatten*"\t" : v.to_s ) end else fields.zip(v).each do |field,v| puts "#{Log.color :magenta, field+":"} #{v}" end end else puts "#{Log.color :magenta, "value:"} #{v}" end exit end parser = TSV::Parser.new tsv, :key_field => key_field, :fields => fields, :type => options[:type], :header_hash => options[:header_hash], :sep => options[:sep] fields ||= parser.fields i = 0 TSV.traverse(parser) do |k,v| if key== "#{i}" key = k.first elsif key.nil? key = k.first end i += 1 next unless k.include?(key) k = k.first if Array === k puts Log.color(:blue, "Key: #{ k }") if fields if fields.length == 1 if options[:lines] puts (Array === v ? v.flatten*"\n" : v.to_s ) else puts (Array === v ? v.flatten*"\t" : v.to_s ) end else fields.zip(v).each do |field,v| puts "#{Log.color :magenta, field+":"} #{v}" end end else puts "#{Log.color :magenta, "value:"} #{Misc.fingerprint v}" end end