我有一个由管道分隔的文件。我不确定哪种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。
答案 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