BEGIN {MaxX = -10000000000 MinX = -1*MaxX} NF==2 {N++; Some[N]; readData(All) } END {print Left,Right; label(Left,Right,All,Some)} function readData(d, i) { if($1 < MinX) {MinX=$1; Left = N} if($1 > MaxX) {MaxX=$1; Right = N} for(i=1;i<=NF;i++) d[N,i]=$i } function crossProduct(all,base,a,b, i,x,y) { for(i=1;i<=NF;i++) { x[i] = all[a,i] - all[base,i] y[i] = all[b,i] - all[base,i] } return x[1]*y[2] - x[2]*y[1] } function label(l,r,all,some, i,over,under) { for(i in some) crossProduct(all,Left,i,r) > 0 ? under[i] : over[i] for(i in over) print "over " i for(i in under) print "under " i }