我有一个很大的 ASCII 数据文件,想通过欧氏距离 MINDISTANCE=5.2 到某个点 (x0, y0, z0)=(1,2,3) 选择数据。 换句话说 if(sqrt((x0-v2)^2+(y0-v3)^2+(z0-v4)^2))>MINDISTANCE) 然后打印行($0),否则转到下一行并测试条件……
输入
#v1 v2 v3 v4
0 1 2 3
1 4 5 6
2 10 10 17
3 2 3 4
4 20 20 15
5 20 88 16
6 20 99 17
7 20 20 22
8 1 2 3
9 10 10 20
输出
2 10 10 17
4 20 20 15
5 20 88 16
6 20 99 17
7 20 20 22
9 10 10 20
我已经看到,sqrt 的计算是可能的 Attempted to use awk sqrt but only returns 0
否则上述条件可以改为 if(((x0-v2)^2+(y0-v3)^2+(z0-v4)^2))>MINDISTANCE^2) 然后打印行($0),否则转到下一行并测试条件。 ..
最佳答案
这是从您自己的伪代码派生的,并产生您预期的输出。如果我是你,我会尝试自己编写代码并将其用作引用。
BEGIN {
min_distance = 5.2;
x0 = 1;
y0 = 2;
z0 = 3;
}
{
v2 = $2;
v3 = $3;
v4 = $4;
if(sqrt((x0-v2)^2 + (y0-v3)^2 + (z0-v4)^2) > min_distance) {
print $0;
}
}
坦率地说,如果在尝试自己编码之后,您仍然不能想出合适的 awk
代码,我会花几个小时学习 awk
.它非常简单明了,可能值得您花时间。
从命令行运行它...
awk -f /tmp/code.awk /tmp/input.txt
关于awk - 使用 awk 按欧氏距离选择数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39395143/