Подставить элементы массива в операторы регулярных выражений / имена переменных - PullRequest
3 голосов
/ 24 августа 2010

Задавалось вопросом, выполнимо ли это в AWK в течение некоторого времени, но всегда обходил его в прошлом.

Ниже я инициализирую массив с 3 месяцами года ... для удобства чтения я пропустил остальные 9 месяцев. Эти месяцы затем используются в операторе if как часть регулярного выражения, но AWK это не нравится. Я не могу найти что-либо в руководствах по awk / gawk относительно этого вида семантики ... я действительно застрял с повторением одного и того же кода 12 раз? Также возможно ли использовать arr [i] в ​​цикле как подстроку имени переменной? Я написал псевдокод ниже, чтобы дать представление о том, чего я пытаюсь достичь. Я знаю, что это возможно в СНОБОЛЕ ;-) Спасибо!

  BEGIN {   
        arr[0] = "AUG"
        arr[1] = "SEP"
        arr[2] = "OCT"
    }
    {
        for(i in arr)
        {
            if($1 ~ /arr[i]/)
            {
             #Controls flows into here if $1 matches AUG, SEP, OCT
             #Furthermore, pretend I want to intialize a variable like AUGseen:
                       arr[i]seen = 1
            }
        }
    }

Если что-то из этого выполнимо, я очень ценю указатели!

Ответы [ 3 ]

3 голосов
/ 24 августа 2010

Вы можете использовать match для динамических регулярных выражений.

if(match($1, arr[i]))
1 голос
/ 25 августа 2010

вот альтернатива, она не использует массивы.(вы можете сохранить массив для других целей)

BEGIN {
  dates="AUG|SEP|OCT"

}
{
  if( $1 ~ dates) {
     print ...
  }

}
1 голос
/ 24 августа 2010

Я не думаю, что awk поддерживает эту концепцию, но использование функции будет столь же эффективным:

# fail is the default return code, the user should insure that it does not
# exist as a key to arr
function amatch(candidate, arr, fail) {
  for (i in arr) 
      if ( match(candidate,array[i]) ) return i;
  return fail;
}
...