bashawkfindasort

bash, find nearest next value, forward and backward


I have a data.txt file

1    2     3    4      5       6        7   
cat data.txt
13 245 1323 10.1111 10.2222 60.1111 60.22222
13 133 2325 11.2222 11.333  61.2222 61.3333
13 245 1323 12.3333 12.4444 62.3333 62.44444444
13 245 1323 13.4444 13.5555 63.4444 63.5555

Find next nearest: My target value is 11.6667 and it should find the nearest next value in column 4 as 12.3333

Find previous nearest: My target value is 62.9997 and it should find the nearest previous value in column 6 as 62.3333

I am able to find the next nearest (case 1) by

awk -v c=4 -v t=11.6667 '{a[NR]=$c}END{
        asort(a);d=a[NR]-t;d=d<0?-d:d;v = a[NR]
        for(i=NR-1;i>=1;i--){
                m=a[i]-t;m=m<0?-m:m
                if(m<d){
                    d=m;v=a[i]
                }
        }
        print v
}' f
12.3333

Any bash solution? for finding the previous nearest (case 2)?


Solution

  • Try this:

    $ cat tst.awk
    {
        if ($fld > tgt) {
            del = $fld - tgt
            if ( (del < minGtDel) || (++gtHit == 1) ) {
                minGtDel = del
                minGtVal = $fld
            }
        }
        else if ($fld < tgt) {
            del = tgt - $fld
            if ( (del < minLtDel) || (++ltHit == 1) ) {
                minLtDel = del
                minLtVal = $fld
            }
        }
        else {
            minEqVal = $fld
        }
    }
    END {
        print (minGtVal == "" ? "NaN" : minGtVal)
        print (minLtVal == "" ? "NaN" : minLtVal)
        print (minEqVal == "" ? "NaN" : minEqVal)
    }
    

    .

    $ awk -v fld=4 -v tgt=11.6667 -f tst.awk file
    12.3333
    11.2222
    NaN
    
    $ awk -v fld=6 -v tgt=62.9997 -f tst.awk file
    63.4444
    62.3333
    NaN
    
    $ awk -v fld=6 -v tgt=62.3333 -f tst.awk file
    63.4444
    61.2222
    62.3333