#!/bin/bash FILES=$(ls $1) average() { typeset field="$1" awk ' BEGIN { average_real=0; average_sys=0; average_user=0; average_majorpf=0; average_minorpf=0; average_swapped=0; average_cs=0; average_waits=0; average_files_in=0; average_files_out=0; average_signals=0; count=0 } /^'$field' / { name=$1; real=$2; sys=$3; user=$4; majorpf=$5; minorpf=$6; swapped=$7; cs=$8; waits=$9; files_in=$10; files_out=$11; signals=$12; average_real+=real; average_sys+=sys; average_user+=user; average_majorpf+=majorpf; average_minorpf+=minorpf; average_swapped+=swapped; average_cs+=cs; average_waits+=waits; average_files_in+=files_in; average_files_out+=files_out; average_signals+=signals; count+=1 } END { print name" "average_real/count" "average_sys/count" "average_user/count" "average_majorpf/count" "average_minorpf/count" "average_swapped/count" "average_cs/count" "average_waits/count" "average_files_in/count" "average_files_out/count" "average_signals/count }' } adjusted_average() { typeset field="$1" awk -v real_name=$2 -v real_real=$3 -v real_sys=$4 -v real_user=$5 \ -v real_majorpf=$6 -v minorpf=$7 -v real_swapped=$8 -v real_cs=$9 \ -v real_waits=$10 -v real_files_in=$11 -v real_files_out=$12 \ -v real_signals=$13 ' function abs(value) { if (value < 0) return -value; else return value; } BEGIN { average_real=0; average_sys=0; average_user=0; average_majorpf=0; average_minorpf=0; average_swapped=0; average_cs=0; average_waits=0; average_files_in=0; average_files_out=0; average_signals=0; count=0 } /^'$field' / { name=$1; real=$2; sys=$3; user=$4; majorpf=$5; minorpf=$6; swapped=$7; cs=$8; waits=$9; files_in=$10; files_out=$11; signals=$12; if ( abs(real - real_real) > real_real ) { printf "IGNORED: %s %f\n",name,real > "/dev/stderr" next; } average_real+=real; average_sys+=sys; average_user+=user; average_majorpf+=majorpf; average_minorpf+=minorpf; average_swapped+=swapped; average_cs+=cs; average_waits+=waits; average_files_in+=files_in; average_files_out+=files_out; average_signals+=signals; count+=1 } END { print name" "average_real/count" "average_sys/count" "average_user/count" "average_majorpf/count" "average_minorpf/count" "average_swapped/count" "average_cs/count" "average_waits/count" "average_files_in/count" "average_files_out/count" "average_signals/count }' } mkdir average.$$ for file in $FILES do FIELDS=$(awk '{ print $1 }' $1/$file) for field in $FIELDS do for dir in $* do cat $dir/$file done | average $field > tmp.$$ for dir in $* do cat $dir/$file done | adjusted_average $field $(cat tmp.$$) rm -f tmp.$$ done > average.$$/$file done