#!/usr/bin/awk -f ### mean.awk # calculate mean average BEGIN { #OFMT = "%.18g" sign = "[+-±]?" decimal = "[0-9]+[.]?[0-9]*" fraction = "[.][0-9]*" exponent = "([Ee]" sign "[0-9]+)?" number = "^" sign "(" decimal "|" fraction ")" exponent "$" } # Welford's 'online' algorithm for variance NF > 0 { for (m=1; m<=NF; m++) { if (m ~ number) { count += 1 delta0 = $m - mean mean = mean + delta0/count delta1 = $m - mean M2 = M2 + delta0*delta1 if (count > 1) var = M2/(count - 1) else var = "nan" } } } END { print "mean", "std_dev", "std_err", "count" print mean, sqrt(var), sqrt(var/count), count }