AWK快速值search

我需要一个快速的方法来匹配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)