BEGIN{FS=OFS=","; Bins=2; Start=2} Pass==2 && /#/ { for(I=1;I<=NF;I++) Name[I]=$I; print } Pass==2 && FNR==1 { for(I=Start;I<=NF;I++) rank(I,Col,Swaps,Lasts,trim(Name[I]),int(N/Bins)) } /#/ { next } Pass==1 { N++; for(I=Start;I<=NF;I++) Col[I,++Col[I,0]] = $I } Pass==2 { #print "> "$0 for(I=Start;I<=NF;I++) $I = Swaps[I,$I] $NF= "_" $NF print $0 } END { saya("lasts",Lasts,Bins ".log") for(I in Lasts) print I " " Lasts[I] } #END { saya("lasts",Lasts)} function trim(s, t) { t=s sub(/^[ \t]*/,"",t) sub(/[ \t]*$/,"",t) return t } function saya(str,a,out, i,j,tmp,com) { out=out ? out : "/dev/stdout" com = "sort > " out for(i in a) { j= i gsub(SUBSEP,",",j); print "#" str "[" i "]=" a[i] | com } } #END{ for(I in Swaps) print I " " Swaps[I] } function rank(col,cols,swaps,lasts,name,minSize, max,last,i,n,size,tmp) { max=cols[col,0] for(i=1; i<=max; i++) tmp[i]=cols[col,i] n=asort(tmp); last=1 swaps[col,tmp[1]]=last lasts[name,last]=tmp[1] for(i=2; i<=n; i++) { if ( (tmp[i] != tmp[i-1]) && (size >= minSize)) { last++ size = 0 } else { size++ } swaps[col,tmp[i]]=last lasts[name,last]=tmp[i] } }