使用awk按欧几里德距离选择数据
我有一个很大的ASCII数据文件,我想通过到某个点x0,y0,z0=1,2,3的欧几里德距离MINDISTANCE=5.2来选择数据。 换句话说,如果SQRTX0-v2^2+y0-v3^2+z0-v4^2>MINDISTANCE,则打印行$0,否则转到下一行并测试条件 输入使用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
#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代码的主块,即第二块代码。