AWK быстрый поиск значений - PullRequest
       7

AWK быстрый поиск значений

2 голосов
/ 22 сентября 2011

Мне нужен быстрый способ сопоставить значение в 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 ]

3 голосов
/ 22 сентября 2011

Если искомая подстрока имеет одинаковую длину и позицию в целевой строке (скажем, последние 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.

0 голосов
/ 22 сентября 2011

Поместите все числа из number_list в массив awk, и у вас будет быстрый поиск.

if (substr($5,9) in numbers)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...