【问题标题】:get the nearest integer [closed]获取最接近的整数[关闭]
【发布时间】:2017-12-17 14:36:38
【问题描述】:

我有一个由管道分隔的文件。我不确定哪个 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。对于第三行,最近的 5将是 1。

【问题讨论】:

  • 输出中的 1 和 10 是从哪里来的?

标签: bash shell awk sed scripting


【解决方案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

【讨论】:

    【解决方案2】:

    给定:

    $ 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 中类似地完成,方法是根据第一个值定义一个客户排序函数,比较其余部分,排序,取第一个。

    【讨论】:

      【解决方案3】:

      这是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
      

      【讨论】:

        猜你喜欢
        • 2020-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多