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