我需要一个快速的方法来匹配AWK中的值,我有250k值来search。
我正在做这样的事情:
#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;}
任何build议更快的search?
如果您要搜索的子字符串在目标字符串中具有一致的长度和位置(比如最后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 (ie 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
次。
将number_list
所有数字number_list
放到一个awk数组中,然后快速查找。
if (substr($5,9) in numbers)