Bash 获取最接近的整数

Bash 获取最接近的整数,bash,shell,awk,sed,scripting,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 4 5}中2的最近值是1。同样地,对于第二行而言,{1 2 3 10 14}中距离8最近的是10。对于第三行而言,距离5最近的是1。给出: $ echo "$ns" 2|1 1 4 5 8|1 2 2 3 10 14 5|1 50 100

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

我的文件如下所示:

2|1 1 4 5
8|1 2 2 3 10 14
5|1 50 100
我想得到输出:

1
10
1
说明:在第一行中,{1 4 5}中2的最近值是1。同样地,对于第二行而言,{1 2 3 10 14}中距离8最近的是10。对于第三行而言,距离5最近的是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
中,也可以通过基于与rest、sort、take-first比较的第一个值定义客户排序函数来完成类似操作。

给定:

$ 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
中也可以这样做,根据与rest、sort、take first比较的第一个值定义客户排序函数。

这是使用
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
awk-F“[\t|]”{
n=$2;m=($1-$2)*($1-$2)

对于(i=3;i这是一种使用
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
awk-F“[\t|]”{
n=$2;m=($1-$2)*($1-$2)
对于(i=3;i
$awk-F'[|]''{
sq=($2-$1)*($2-$1);a=2;
对于(i=3;i
$awk-F'[|]''{
sq=($2-$1)*($2-$1);a=2;

对于(i=3;i)输出中的1和10来自哪里?输出中的1和10来自哪里?