从文件bash中找到给定值的最接近值

时间:2015-03-13 13:55:18

标签: 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

我正在寻找最接近&#34; 5,50&#34;并且它仍然发现3,10是最接近的,这不是真的,它应该是3,90。我现在使用正确的语言环境。

1 个答案:

答案 0 :(得分:2)

您必须迭代每个字段以查找值和目标值之间的最小差异。令人惊讶的是,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