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