bash中,找到最近的下一个值,向前和向后 [英] bash, find nearest next value, forward and backward

查看:153
本文介绍了bash中,找到最近的下一个值,向前和向后的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个文件的data.txt

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

查找下一个最近的:我的目标值为 11.6667 ,它应该找到 4列作为最接近的下一个值 12.3333

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

查找previous最近的:我的目标值为 62.9997 ,它应该发现在最近的previous值第6列 62.3333

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

我能找到

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

任何bash的解决方案?为寻找previous最近的(情况2)?

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

推荐答案

试试这个:

$ 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

这篇关于bash中,找到最近的下一个值,向前和向后的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆