【发布时间】:2020-08-07 21:29:48
【问题描述】:
我有带有 x1 、 x2 和 x 值的输入文件,我想检查 x 是否是 x1 和 x2 之间的中点。 但是比较失败了。
示例输入文件
x1=20.9280 x2=20.9600 x=20.9440
x1=20.9280 x2=20.9600 x=20.9440
x1=22.7840 x2=22.8160 x=22.8000
awk 命令
awk -F'[ =]' '{ if(($2 + $4)/2 != ($6)) print ($2 + $4)/2, " ", $6;}' sample
输出
20.944 20.9440
20.944 20.9440
22.8 22.8000
由于小数点后有多余的零,比较失败。请帮忙解决。
【问题讨论】:
-
在进行比较之前,您可以在
$6的末尾用sub(/0+$/, "", $6)删除0。但一般来说,直接比较浮点数是有风险的,通常会检查两个浮点数之间的绝对差异反对一个小的价值,比如0.00001 -
@EdMorton 我认为 OP 想要打印最后一列与中点计算不匹配的情况,例如
x1=20.9280 x2=20.9600 x=20.9240(更改示例).. 但是使用有问题的代码,所有三行即使它们在最后一列中都有正确的中点,也被打印出来了。这就是为什么 OP 说他们不希望输出例如有问题的行... -
@EdMorton 所以,OP 可能只是在寻找
awk -F'[ =]' '{gsub(/\./,"")} ($6*2) != ($2+$4)' -
@Sundeep 谢谢,我是个白痴,我错过了比较中的
!。是的,我在回答中提出了这种转换。 -
好吧,我从你的回答中复制了它;)顺便说一句,好把戏!
标签: awk floating-point