Select 使用 awk 的欧式距离数据
Select data by euclidean distance with awk
我有一个很大的 ASCII 数据文件,并希望通过欧氏距离 MINDISTANCE=5.2 将数据 select 到某个点 (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 的计算可以在
否则上述条件可以改为
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 = ;
v3 = ;
v4 = ;
if(sqrt((x0-v2)^2 + (y0-v3)^2 + (z0-v4)^2) > min_distance) {
print [=10=];
}
}
坦率地说,如果在尝试自己编写代码后,您仍然不能想出合适的 awk
代码,我会花几个小时学习 awk
。它非常简单明了,可能值得您花时间。
从命令行运行它...
awk -f /tmp/code.awk /tmp/input.txt
或更简短
$ awk 'NR>1 && (-1)^2+(-2)^2+(-3)^2 > 5.2^2' file
2 10 10 17
4 20 20 15
5 20 88 16
6 20 99 17
7 20 20 22
9 10 10 20
我有一个很大的 ASCII 数据文件,并希望通过欧氏距离 MINDISTANCE=5.2 将数据 select 到某个点 (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 的计算可以在
否则上述条件可以改为 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 = ;
v3 = ;
v4 = ;
if(sqrt((x0-v2)^2 + (y0-v3)^2 + (z0-v4)^2) > min_distance) {
print [=10=];
}
}
坦率地说,如果在尝试自己编写代码后,您仍然不能想出合适的 awk
代码,我会花几个小时学习 awk
。它非常简单明了,可能值得您花时间。
从命令行运行它...
awk -f /tmp/code.awk /tmp/input.txt
或更简短
$ awk 'NR>1 && (-1)^2+(-2)^2+(-3)^2 > 5.2^2' file
2 10 10 17
4 20 20 15
5 20 88 16
6 20 99 17
7 20 20 22
9 10 10 20