bash,向前和向后查找最近的下一个值

标签 bash awk find asort

我有一个 data.txt 文件

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

查找上一个最近的值:我的目标值为 62.9997,它应该在 第 6 列 中找到最近的上一个值,如 62.3333

我可以通过以下方式找到下一个最近的(情况 1)

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 解决方案吗?用于查找前一个最近的(情况 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,向前和向后查找最近的下一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23822564/

相关文章:

linux - 在正则表达式之后更改一行的一部分

python - 在 Python 中使用正则表达式搜索字符串

perl - perl、awk、grep中按行号获取一行的内容

bash - awk 简单计算器函数在包含单字母目录的工作目录中表现异常

vb.net - Controls.Find 方法中 SearchAllChildren 参数的含义

java - 在 Java 中查找不可序列化字段的好方法

bash - 不能将 bash 变量用于 tar 的排除

java - 如何从 shell 脚本调用 Java 程序,而不让 shell 脚本等待程序完成执行?

bash - 获取刚结束的进程返回的状态

linux - 对字符串数组中的唯一条目进行排序和计数