2015-03-13 80 views
2

有人可以帮助我在bash中使用脚本/ oneliner,它可以从文件中找到最接近的给定值..?例如:找到距文件bash中给定值最近的值

我在文件中有下列值:

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

我需要找到最接近的值,例如“90”。结果应该是100 +这个值是100像这样的值。

我remaked我输入从线列和应用这个代码

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 

尝试它和Im寻找最接近的号码为 “5,50”,其还发现3, 10为最接近的,这是不正确的,应该是3,90。我现在使用正确的语言环境。

+0

你有什么已经尝试过?发生了什么? – 2015-03-13 13:59:20

+0

我重建了我的输入从行到列并应用此代码'awk -vc = 1 -vt = 35'NR == 1 {d = $ ct; d = d <0?-d:d; v = $ c;下一步} {m = $ ct; m = m <0?-m:m} m Heatv 2015-03-13 14:03:22

+1

请把你的问题与适当的格式,请:) :) – 2015-03-13 14:03:43

回答

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 
+1

对于最小或最大计算,您应始终使用第一个数据值初始化变量,而不是选取任意一个。如果你做出这样的改变,我会删除我的答案,因为那样他们就会完全相同,你在我前面几分钟就到了。 – 2015-03-13 14:46:28

+1

伟大的建议编辑 – 2015-03-13 14:50:49

+0

非常抱歉不回答这个问题,但我遇到了这个问题,它是我的错,我需要用真正的数字完成,比如找到3,20和3,95之间最接近的数字3,7 。这个代码中的一个小小的变化是可能的吗?再次感谢 – Heatv 2015-03-13 15:28:59

相关问题