【发布时间】:2016-11-28 14:24:07
【问题描述】:
有一个典型的问题:给定一个值列表,检查它们是否存在于数组中。
在awk 中,技巧val in array 确实很有效。因此,典型的想法是将所有数据存储在一个数组中,然后继续进行检查。例如,这将打印数组中第一列值存在的所有行:
awk 'BEGIN {<<initialize the array>>} $1 in array_var' file
但是,初始化数组需要一些时间,因为val in array 会检查索引val 是否在array 中,而我们通常存储在array 中的是一组值。
当从命令行提供值时,这变得更加相关,其中那些是我们想要包含为数组索引的元素。例如,在这个基本示例中(基于recent answer of mine,这引发了我的好奇心):
$ 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[]。
有没有更快的方法来初始化数组的索引,而不是设置一个然后使用它的值作为确定的索引?
【问题讨论】: