
我一直使用C语法在awk中编写代码,所以我总是使用(i = 1; i <= maxindex;
几天前awk

array)也可以实现此功能,并且很高兴地采用了它,并假定这只是前一个方法的简化形式,直到以下代码段始终无法按我期望的方式运行:
对于(i = 1; i <= nf; i ++){p =(fx [i] ^ 2 + fy [i] ^ 2 + fz [i] ^ 2)^ 0.5;半径=
“否”; for(半径rc)是否为(r-radius [rc] <1e-10 && r-radius [rc]> -1e-10

){inradius =“是”; n [rc] ++; break;} if(inradius ==“ no”){rc ++;
半径[rc] = r; n [rc] ++;} ...}
此代码旨在根据坐标点与原点的距离对其进行分类. 最外面的for循环以显式方式遍历所有点,其中fx,fy和fz分别是该点的x,y和z坐标值. 对于每个点,计算从点到原点的距离r,然后确定距离r是否在现有距离数组半径中. 如果是,则将点分类为现成类别,否则将元素(即新类别)添加到半径数组中awk数组初始化,然后将点分类为新类别.

但是,即使有一个新的距离r出现,它的运算结果也立刻使我感到困惑,用来表征这些r的类别的rc在确定值之后就停止增长,好像11行rc ++莫名其妙地无效!我检查了很多遍脚本,甚至进行了很多猜测,但是我找不到问题所在. 无奈之下,第四行的隐式遍历
(半径rc)被改写为(rc = 1; rc <= maxrc; rc ++)的显式形式,但我没有希望,但意外发现问题消失了.
此后,awk伙计,找到了有关(var in array)语句的解释,并最终实现了它,其内容为: 该命令的顺序

var横向未定义数组的索引.
也就是说awk数组初始化,var遍历数组的顺序是不确定的,但是我一直都将其理解为(var = 1; var <= maxindex;
var ++)是一种简化的编写方式. 因此,面对未知的事物,我们必须保持谨慎的态度.
考虑到这一点,随着智慧成长.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-192602-1.html
干得好
_)