Arrays 如何将变量切片到数组索引中?

Arrays 如何将变量切片到数组索引中?,arrays,awk,gawk,Arrays,Awk,Gawk,有一个典型的问题:给定一个值列表,检查它们是否存在于数组中 在awk中,数组中的技巧val非常有效。因此,典型的想法是将所有数据存储在一个数组中,然后继续执行检查。例如,这将打印数组中第一列值所在的所有行: awk 'BEGIN {<<initialize the array>>} $1 in array_var' file split(values,v)将变量values切片为数组v[1]=“hello”;v[2]=“再见” for(i in v)names[v[i

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

awk
中,数组中的技巧
val
非常有效。因此,典型的想法是将所有数据存储在一个数组中,然后继续执行检查。例如,这将打印数组中第一列值所在的所有行:

awk 'BEGIN {<<initialize the array>>} $1 in array_var' file
  • split(values,v)
    将变量
    values
    切片为数组
    v[1]=“hello”;v[2]=“再见”
  • for(i in v)names[v[i]]
    使用
    names[“hello”]
    初始化另一个数组
    names[]
    ,使用空值初始化另一个数组
    names[“adieu”]
    。这样,我们就准备好了
  • 检查第一列是否为
    名称[]
    中的任何索引的
    $1
如您所见,我们将一个临时变量
v
切片,以便稍后初始化最后一个有用的变量
names[]


有没有更快的方法来初始化数组的索引,而不是设置一个数组,然后将其值用作最终数组的索引?

不是数组解决方案,但有一个技巧是使用模式匹配。要消除部分匹配,请使用分隔符包装搜索值和数组值。以你为例,

$ awk -v values="hello adieu" 'FS values FS ~ FS $1 FS' file
hello 23
adieu 99
不,这是最快(由于散列查找)和最健壮(由于字符串比较)的方法来完成您想要的任务

这:

启动时发生一次,在以下情况下几乎不需要时间:

$1 in array_var

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

regexp比较比散列查找慢,因此在执行此操作时需要处理数据中的regexp元字符,从而产生错误匹配。
BEGIN{split(values,v); for (i in v) names[v[i]]}
$1 in array_var