使用awk按欧几里德距离选择数据

使用awk按欧几里德距离选择数据,awk,euclidean-distance,Awk,Euclidean Distance,我有一个很大的ASCII数据文件,我想通过到某个点x0,y0,z0=1,2,3的欧几里德距离MINDISTANCE=5.2来选择数据。 换句话说,如果SQRTX0-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

我有一个很大的ASCII数据文件,我想通过到某个点x0,y0,z0=1,2,3的欧几里德距离MINDISTANCE=5.2来选择数据。 换句话说,如果SQRTX0-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的计算是可能的

否则,上述条件可更改为
如果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 'NR>1 && ($2-1)^2+($3-2)^2+($4-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

您似乎已经编写出了伪代码,为什么不尝试一下并询问您是否面临问题?同意上述评论,您所需要的只是awk“{if……print$0}”文件[file2…]。祝你好运。Thx下面的代码可以工作,但我想跳过以input.txt开头的所有行:awk'{if sqrt$2-1**2+$3-2**2+$4-3**2>5.2 print$0}'input.txt谢谢,现在我可以找出我的代码不工作的原因了!我如何告诉您的代码跳过以of input.txt开头的所有行?在这种情况下,这不是问题,但如果v2。。。v4是数字,这可能是个问题。我的尝试无效:ifsqrtx0-v2^2+y0-v3^2+z0-v4^2>最小距离和$1!//{print$0;}请尝试awk'/^[^]/{print}'/tmp/input.txt。/^[^]/应该是您要查找的筛选器。将该正则表达式前置到此awk代码的主块,即第二块代码。