如何将变量切片为数组索引?

How to slice a variable into array indexes?

有一个典型的问题:给定一个值列表,检查它们是否存在于数组中。

awk中,技巧val in array确实很管用。因此,典型的想法是将所有数据存储在一个数组中,然后继续进行检查。例如,这将打印第一列值存在于数组中的所有行:

awk 'BEGIN {<<initialize the array>>}  in array_var' file

但是,初始化数组需要一些时间,因为 val in array 检查索引 val 是否在 array 中,以及我们通常存储在 array 中的内容是一组值。

当从命令行提供值时,这变得更加相关,其中那些是我们想要作为数组索引包含的元素。例如,在这个基本示例中(基于 ,这引发了我的好奇心):

$ cat file
hello 23
bye 45
adieu 99
$ awk -v values="hello adieu" 'BEGIN {split(values,v); for (i in v) names[v[i]]}  in names' file
hello 23
adieu 99

如您所见,我们切入一个临时变量 v 以稍后初始化最终有用的变量 names[]

有没有更快的方法来初始化数组的索引,而不是设置一个数组然后使用它的值作为确定的索引?

不是数组解决方案,但一个技巧是使用模式匹配。要消除部分匹配,请使用定界符将搜索值和数组值包装起来。例如,

$ awk -v values="hello adieu" 'FS values FS ~ FS  FS' file
hello 23
adieu 99

不,这是执行所需操作的最快(由于哈希查找)和最可靠(由于字符串比较)方式。

这个:

BEGIN{split(values,v); for (i in v) names[v[i]]}

在启动时发生一次并且几乎不会花时间:

 in array_var

每行输入发生一次(需要最佳性能的地方也是如此)是散列查找,因此是将字符串值与一组字符串进行比较的最快方法。