有人可以帮助我在 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
我正在寻找最接近“5,50”的数字,但它仍然发现3,10是最接近的,这是不正确的,它应该是3,90。我现在使用正确的区域设置。
最佳答案
您必须迭代每个字段才能找到该值与目标值之间的最小差异。令人惊讶的是,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
关于linux - 从文件 bash 中查找与给定值最接近的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29034081/