require 'maasha/biopieces'
casts = []
-casts << {long: 'keys', short: 'k', type: 'list', mandatory: false, default: nil, allowed: nil, disallowed: nil}
-casts << {long: 'no_keys', short: 'K', type: 'list', mandatory: false, default: nil, allowed: nil, disallowed: nil}
+casts << {long: 'keys', short: 'k', type: 'list', mandatory: false, default: nil, allowed: nil, disallowed: nil}
+casts << {long: 'no_keys', short: 'K', type: 'list', mandatory: false, default: nil, allowed: nil, disallowed: nil}
+casts << {long: 'no_stream', short: 'x', type: 'flag', mandatory: false, default: nil, allowed: nil, disallowed: nil}
+casts << {long: 'data_out', short: 'o', type: 'file', mandatory: false, default: nil, allowed: nil, disallowed: nil}
options = Biopieces.options_parse(ARGV, casts)
key = key.to_sym
value = record[key]
- stats[key][:sum] ||= 0
- stats[key][:count] ||= 0
-
- if num = to_number(value)
- stats[key][:min] = min(stats[key][:min], num)
- stats[key][:max] = max(stats[key][:max], num)
- stats[key][:type] = :numeric
- stats[key][:sum] += num
- else
- stats[key][:min] = min(stats[key][:min], value.length)
- stats[key][:max] = max(stats[key][:max], value.length)
- stats[key][:type] = :alphabetic
- stats[key][:sum] += value.length
+ if value
+ stats[key][:sum] ||= 0
+ stats[key][:count] ||= 0
+
+ if num = to_number(value)
+ stats[key][:min] = min(stats[key][:min], num)
+ stats[key][:max] = max(stats[key][:max], num)
+ stats[key][:type] = :numeric
+ stats[key][:sum] += num
+ else
+ stats[key][:min] = min(stats[key][:min], value.length)
+ stats[key][:max] = max(stats[key][:max], value.length)
+ stats[key][:type] = :alphabetic
+ stats[key][:sum] += value.length
+ end
+
+ stats[key][:count] += 1
end
-
- stats[key][:count] += 1
end
+
+ output.puts record unless options[:no_stream]
+ end
+
+ if options[:data_out]
+ data_out = File.open(options[:data_out], 'w')
end
stats.each do |key, value|
:KEY => key,
:TYPE => value[:type].to_s.capitalize,
:COUNT => value[:count],
- :MIN => value[:min],
- :MAX => value[:max],
- :SUM => value[:sum],
- :MEAN => (value[:sum] / value[:count].to_f).round(1)
+ :MIN => value[:min].is_a?(Float) ? "%0.2f" % value[:min] : value[:min],
+ :MAX => value[:max].is_a?(Float) ? "%0.2f" % value[:max] : value[:max],
+ :SUM => value[:sum].is_a?(Float) ? "%0.2f" % value[:sum] : value[:sum],
+ :MEAN => "%0.2f" % (value[:sum] / value[:count].to_f)
}
- output.puts stat_record
+ if options[:data_out]
+ data_out.puts stat_record
+ else
+ output.puts stat_record
+ end
end
end