【问题标题】: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。
【问题讨论】:
标签:
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