有人可以帮助我使用bash中的script / oneliner,它从文件中找到最接近的给定值..?例如:
我在文件中有这些值:
SJ ENG MGR DE CJ RU CHI JPN
1 2 3 10 20 50 100 900
我需要找到最接近的值,例如" 90"。结果应该是100 +列,其中的值是:100 CHI或类似的东西。
我将输入从行重新列入列并应用此代码
awk -v c=1 -v t=35 'NR==1{d=$c-t;d=d<0?-d:d;v=$c;next}{m=$c-t;m=m<0?-m:m}m<d{d=m;v=$c}END{print v}'
它有效,但我不能将这行代码重新编写成符合要求的代码。它使用列但不使用行,我需要像我的例子中的工作解决方案。
谢谢。
//修改
好的,所以我仍然坚持在这里,我试着用这个输入SJ ENG MGR DE CJ RU CHI JPN
9,50 3,10 3,12 3,70 3,50 3,80 3,75 3,90
我正在寻找最接近&#34; 5,50&#34;并且它仍然发现3,10是最接近的,这不是真的,它应该是3,90。我现在使用正确的语言环境。
答案 0 :(得分:2)
您必须迭代每个字段以查找值和目标值之间的最小差异。令人惊讶的是,awk没有实现abs()
,所以我在这里提供了一个。
awk -v target=90 '
# store the header for each column
NR == 1 {for (i=1; i<=NF; i++) header[i] = $i; next}
function abs(val) { return (val < 0 ? -1*val : val) }
{
min = abs($1 - target)
min_idx = 1
for (i=2; i<=NF; i++) {
diff = abs($i - target)
if (diff < min) {
min = diff
min_idx = i
}
}
print $min_idx, header[min_idx]
}
' file
100 CHI
总结Ed的说明,使脚本可以识别语言环境:
env LC_ALL=en_DK.utf8 gawk --use-lc-numeric -v target=5,5 '
# ... script unchanged
' file2
3,90 JPN