如何将变量切片为数组索引?
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
split(values,v)
将变量 values
切片成数组 v[1]="hello"; v[2]="adieu"
for (i in v) names[v[i]]
用 names["hello"]
和 names["adieu"]
用空值初始化另一个数组 names[]
。这样,我们就可以
in names
检查第一列是否是 names[]
. 中的任何索引
如您所见,我们切入一个临时变量 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
每行输入发生一次(需要最佳性能的地方也是如此)是散列查找,因此是将字符串值与一组字符串进行比较的最快方法。
有一个典型的问题:给定一个值列表,检查它们是否存在于数组中。
在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
split(values,v)
将变量values
切片成数组v[1]="hello"; v[2]="adieu"
for (i in v) names[v[i]]
用names["hello"]
和names["adieu"]
用空值初始化另一个数组names[]
。这样,我们就可以in names
检查第一列是否是names[]
. 中的任何索引
如您所见,我们切入一个临时变量 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
每行输入发生一次(需要最佳性能的地方也是如此)是散列查找,因此是将字符串值与一组字符串进行比较的最快方法。