#!/usr/bin/env ruby script = nil target = nil $: << '.' if ARGV.size == 1 then target = $stdin script = ARGV.shift elsif ARGV.size == 2 then target = open(ARGV.shift, 'r') rescue nil script = ARGV.shift else puts "Usage1 : #{__FILE__} log_CSV script" puts "Usage2 : | #{__FILE__} script" exit end unless target then puts "target not found!!" exit end # ƒ^[ƒQƒbƒg•ชŠ„script‚ฬ’ฒฎ unless require script then puts "script not found!!" exit end target_data = {} current_key = current_range = nil target.each{|line| values = line.split(/,/) values[0] = values[0].to_i values[1..-1] = values[1..-1].collect{|item| item.to_f} if !current_range || (!current_range.include?(values[1])) then current_key = current_range = nil TARGET.each{|key, t_range| if t_range.include?(values[1]) then current_key, current_range = key, t_range unless target_data.include?(current_key) target_data[current_key] = [] (values.size - 2).times{|i| target_data[current_key] << []} end end } end if current_key then target_data[current_key].size.times{|i| target_data[current_key][i] << values[i + 2] } end } # ƒส,ƒะ‚๐‹‚฿‚้ def mu_sigma2(data) mu = [] sigma2 = [] data.each{|item| sum = 0.0 sum2 = 0.0 item.each{|v| sum += v sum2 += v ** 2 } mu << (sum / item.size) sigma2 << (sum2 / item.size) - ((sum / item.size) ** 2) } return [mu, sigma2] end target_data.sort{|a, b| a[0] <=> b[0]}.each{|key, values| mu, sigma2 = mu_sigma2(values) puts ["#{key}_mu", mu].flatten.join(',') puts ["#{key}_sigma", sigma2.collect{|item| Math::sqrt(item)}].flatten.join(',') }