BEGIN { FS=OFS=","; IGNORECASE =1; DontKnow = "?"; Inf = 10^32; } /@attribute/ { Attr++ } /@attribute/ && (/numeric/ || /real/ || /integer/) { Range[asMax(Attr)] = -1*Inf; Range[asMin(Attr) ] = Inf; } /@[rda]/ { next} { for(I in Range) if (I > 0) { if ( $I ~ DontKnow ) continue; if ( $I > Range[asMax(I)]) Range[asMax(I)]=$I; if ( $I < Range[asMin(I)]) Range[asMin(I)]=$I; }} END { for(I=1;I<=Attr;I++) if (numericp(I)) print "!",I, Range[asMin(I)], Range[asMax(I)] } function numericp(x) { return x > 0 && x in Range } function asMax(x) { return x } function asMin(x) { return -1 * x}