AWK快速值搜索

时间:2011-09-22 16:33:52

标签: linux shell unix awk

我需要一种快速匹配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;}

有关更快搜索的建议吗?

2 个答案:

答案 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)