linux - 从文件 bash 中查找与给定值最接近的值

标签 linux bash awk

有人可以帮助我在 bash 中使用 script/oneliner 来从文件中找到最接近的给定值吗?示例:

我在文件中有这些值:

SJ ENG MGR DE CJ RU CHI JPN 
1   2   3  10 20 50 100 900

我需要找到最接近的值,例如“90”。结果应该是 100 + 其中包含以下值的列:100 CHI 或类似的值。

我重新制作了从行到列的输入并应用了此代码

awk -v c=1 -v t=35 'NR==1{d=$c-t;d=d<0?-d:d;v=$c;next}{m=$c-t;m=m<0?-m:m}m<d{d=m;v=$c}END{print v}'

它有效,但我无法将这行代码重新制作成可以在线工作的代码。它适用于列,但不适用于行,我需要像我的示例中那样的工作解决方案。

谢谢。

//编辑

好吧,所以我仍然卡在这里,我尝试使用此输入

SJ     ENG    MGR    DE   CJ   RU    CHI     JPN 
9,50   3,10   3,12  3,70 3,50  3,80   3,75 3,90

我正在寻找最接近“5,50”的数字,但它仍然发现3,10是最接近的,这是不正确的,它应该是3,90。我现在使用正确的区域设置。

最佳答案

您必须迭代每个字段才能找到该值与目标值之间的最小差异。令人惊讶的是,awk 没有实现 abs(),因此我在这里提供了一个。

awk -v target=90 '
  # store the header for each column
  NR == 1 {for (i=1; i<=NF; i++) header[i] = $i; next}

  function abs(val) { return (val < 0 ? -1*val : val) }

  {
    min = abs($1 - target)
    min_idx = 1
    for (i=2; i<=NF; i++) {
      diff = abs($i - target)
      if (diff < min) {
        min = diff
        min_idx = i
      }
    }
    print $min_idx, header[min_idx]
  }
' file 
100 CHI

总结 Ed 的使脚本能够识别区域设置的说明:

env LC_ALL=en_DK.utf8 gawk --use-lc-numeric -v target=5,5 '
  # ... script unchanged
' file2
3,90 JPN

关于linux - 从文件 bash 中查找与给定值最接近的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29034081/

相关文章:

bash - 使用awk以svn日志的模式输出

bash - 我可以在我的 Heroku 帐户上运行 bash 脚本吗?

regex - 不是正则表达式中的运算符

linux - AWK 如何修改此代码以打印 num 个实例而不是 0 和 1

regex - 使用跨不同行匹配的大括号重新格式化和清理 CSV 文件

linux - 在命令结果末尾添加计算列

c - 寻找有关 Linux 系统调用的详细文档

Linux:当底层内存映射文件更改时会发生什么?

linux - 在多个语料库上 Grep 多个关键字的快速方法

python - 当 URL 错误时 PhantomJS 不返回错误(python)