这是一个典型的问题:给定一组值,检查它们是否存在于数组中。
在
然而,初始化数组需要一些时间,因为
当从命令行提供值时,这变得更加相关,因为这些值是我们想要包含作为数组索引的元素。例如,在这个基本示例中(基于我最近回答的一个问题,这激发了我的好奇心):
在
awk
中,技巧val in array
非常有效。因此,典型的想法是将所有数据存储在数组中,然后不断进行检查。例如,这将打印所有第一列值存在于该数组中的行。awk 'BEGIN {<<initialize the array>>} $1 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]]} $1 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[]
。这样,我们就可以对其进行以下操作:$1 in names
检查第一列是否为names[]
中的任何索引。
正如你所看到的,我们先将变量切片到临时变量v
中,以便之后能够初始化最终有用的names[]
变量。
除了设置一个变量并使用它的值作为最终数组的索引之外,还有更快的初始化数组索引的方法吗?