# /* vim: set filetype=awk : */ -*- awk -*- BEGIN { FS = OFS = ","; Shrink = 5; Left = -100; Right = 100; Off = "."; Median = "|"; On = "*"; F = "5.1f" } { N[$1]++; Sum[$1] += $3; SumSq[$1] += $3*$3; push(Data,$1,$3) } END { #print "#rx,mean,sd,n,min,q1,median,q3,max,"quart0(Right,Shrink) print "#rx,mean,sd,n,min,s1,s2,median,s4,s5,max,"quart0(Right,Shrink) for(I in N) report(I) } function report(k, mu,sigma,s,n,min,s1,s2,median,s4,s5,max) { mu = mean(N[k],Sum[k]); sigma = sd(N[k],Sum[k],SumSq[k]); n = sort(Data,k,s); #q1 = s[round(n/4)]; #median= s[round(2*n/4)]; #q3 = s[round(3*n/4)]; min = s[1]; s1 = s[round(n/6)]; s2 = s[round(2*n/6)]; median= s[round(3*n/6)]; s4 = s[round(4*n/6)]; s5 = s[round(5*n/6)]; max = s[n]; #printf("%s,%"F",%"F",%d,%"F",%"F",%"F",%"F",%"F",%s\n", # k,mu,sigma,n,min,q1,median,q3,max, # quart(min,q1,median,q3,max,Right,Shrink)) | "sort -t, -r -n +1" printf("%s,%"F",%"F",%d,%"F",%"F",%"F",%"F",%"F",%"F",%"F",%s\n", k,mu,sigma,n,min,s1,s2,median,s4,s5,max, sixtile(min,s1,s2,median,s4,s5,max,Right,Shrink)) | "sort -t, -r -n +1" } function quart0(width,scale, i,l,str) { width /= scale; for(i= -1*width;i<=width;i++) l[round(i)] = Off; l[0] = "0"; for(i= -1*width;i<=width;i++) str = str l[round(i)]; return str } function sixtile(min,s1,s2,median,s4,s5,max,width,scale, i,l,str) { width /= scale min /= scale #q1 /= scale s1 /= scale s2 /= scale s4 /= scale s5 /= scale median /= scale #q3 /= scale max /= scale # First set everything to Off for(i= -1*width; i<=width; i++) l[round(i)]= Off; # Draw between s1 and s2 for(i= s1; i<=s2; i++) l[round(i)]= On; # Draw between s4 and s5 for(i= s4; i<=s5; i++) l[round(i)]= On; #for(i= min; i<=q1; i++) l[round(i)]= On; #for(i= q3; i<=max; i++) l[round(i)]= On; # Mark the median l[round(median)] = Median # Mark the min and max l[round(min)] = Median l[round(max)] = Median # Build the string for(i= -1*width; i<=width; i++) str = str l[round(i)]; return str } function quart(min,q1,median,q3,max,width, scale, i,l,str) { width /= scale min /= scale q1 /= scale median /= scale q3 /= scale max /= scale for(i= -1*width; i<=width; i++) l[round(i)]= Off; for(i= min; i<=q1; i++) l[round(i)]= On; for(i= q3; i<=max; i++) l[round(i)]= On; l[round(median)] = Median for(i= -1*width; i<=width; i++) str = str l[round(i)]; return str } function round(x) { return int(x<0 ? x-0.5 : x+0.5) } function mean(n,sum) { return sum/n } function sd( n,sum,sumSq) { return sqrt((sumSq-((sum*sum)/n))/(n-1))} function push(a,k,v, i) { i= ++a[k,0]; a[k,i]=v; return v } function sort(a,k,s, i,m,n) { m = a[k,0]; for(i=1; i<=m; i++) s[i] = a[k,i]; n=asort(s); return n; }