得到最接近的整数

时间:2017-07-13 01:27:23

标签: bash shell awk sed scripting

我有一个由管道分隔的文件。我不确定哪种bash工具最合适(我想是awk或sed)来找到最接近列出的数字。

我的文件如下:

2|1 1 4 5
8|1 2 2 3 10 14
5|1 50 100

我希望得到输出:

1
10
1

说明:在第一行中,{1 1 4 5}中最近的2是1.同样,对于第二行,{1 2 2 3 10 14}中最近的8是10.对于第3行最近为5将是1。

3 个答案:

答案 0 :(得分:1)

假设:

$ echo "$ns"
2|1 1 4 5
8|1 2 2 3 10 14
5|1 50 100

Ruby很容易:

$ echo "$ns" | ruby -lne 'a=$_.split(/[| \t]/)
                          a.map!{|e| Integer(e)}
                          n=a.shift
                          p a.min_by {|e| (e-n).abs}'
1
10
1

可以在gawk中类似地通过定义基于第一个值的客户排序函数来比较休息,排序,取第一个。

答案 1 :(得分:1)

这是使用awk执行此操作的方法:

awk -F"[ \t|]" '{
    n=$2;m=($1-$2)*($1-$2)
    for(i=3;i<=NF;i++){
        d=($1-$i)*($1-$i)
        if(d<m){n=$i;m=d}
    } print n
}' input

答案 2 :(得分:1)

$ awk -F'[| ]' '{
  sq=($2-$1)*($2-$1);a=2;
  for(i=3;i<=NF;i++){
    sqi=($i-$1)*($i-$1)
    if(sq<sqi){sq=sq}else{sq=sqi;a=i}                                                                                                                                                                         
  } print $a
}' file
1
10
1