我需要一种快速匹配AWK值的方法,我有250k值可供搜索。
我正在做这样的事情:
#list with 250k numbers instead of four
number_list="9998532001 9998536052 9998543213 9998544904"
if ( index(number_list,substr($5,9)) )
{printf "Value: %s\n",$5;}
有关更快搜索的建议吗?
答案 0 :(得分:3)
如果你要搜索的子字符串在目标字符串中具有一致的长度和位置(比如最后6位数字),那么你可以将列表预处理成一个数组,你就可以了。
预处理步骤(可能在BEGIN
目标中)
n=split(numbers_list,a," "); # Rip in input sting into pieces
for ( num in a ) {
key=substr(a[num],length(a[num])-6,6); # Get the last six digits
# Error processing (i.e. collision handling) should go here
list[key]=a[num];
}
然后当你需要进行查找时
i=list[substr($5,9)] # i is now the full number associated with the key
如果您要进行多次查找,这只是一次胜利,因为在预处理过程中您仍需要支付迭代整个列表(实际上是两次)的费用。
请注意,与整数的精确匹配符合已知长度和位置的子字符串,只需使用key=a[num]
(看起来很有趣并导致上述代码的几个简化,但我相信你可以想象它出来了。
如果您要在任何数字中查找任何出现的substring($5,9)
,这将无效,您每次都必须遍历n
。
答案 1 :(得分:0)
将number_list
中的所有数字放入一个awk数组中,您就可以快速查找。
if (substr($5,9) in numbers)