четверг, 11 ноября 2010 г.

Сумма чисел, среднее и стандартное отклонение с помощью awk

Для файла в одну колонку сумма и среднее считается так:
cat data.dat | awk '{sum +=$1} END {print "Сумма=" sum, "Среднее="sum/NR}'
Если нужно посчитать среднее в каждой строке то:
$cat data1.dat
.530 .539 .601 .613 .618
.493 .532 .599 .634 .591
.405 .436 .530 .536 .537
.430 .424 .524 .542 .515
.482 .530 .528 .550 .550
.473 .535 .540 .554 .546
.527 .562 .611 .598 .607
$cat data1.dat | awk '{sum=0; n=0; for (i=1; i<=NF; i++) {sum +=$i; ++n} print sum/n}' 0.5802 0.5698 0.4888 0.487 0.528 0.5296 0.581
Если нужно посчитать среднее и стандартное отклонение в каждом столбце то:
cat data1.dat | awk '{ for (i=1; i<=NF; i++) (sum[i]+= $i) (sumsq[i]+=$i^2)} END {for (i in sum) print sum[i]/NR, sqrt(sumsq[i]/NR-(sum[i]/NR)^2)}'