2010-08-24 3 views
2

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

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

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 
      } 
     } 
    } 

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

+0

Вы не хотите создавать переменную типа «AUGseen» - динамические имена переменных неприятны. Вы также должны использовать массив: 'seen [arr [i]] = 1' –

ответ

3

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

if(match($1, arr[i])) 
+0

Если я правильно понял вопрос, это не реагирует. Кажется, что OP хочет выполнить 'match ($ 1, arr)' и вернуть его true, если $ 1 соответствует * любому элементу 'arr'. – dmckee

+0

Протестировано, отлично работает, так рекомендуется. Любая идея, если имена динамических переменных тоже выполнимы? Thx – jparanich

+0

dmckee, DarkDust, это было правильно ... Я беспокоился, что это неправильно интерпретируется так, как вы это делали. – jparanich

1

Я не думаю, что 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; 
} 
+0

Это полезно иметь, спасибо dmckee. Я действительно не рискнул за пределами различных вариантов awk (кроме gawk), поэтому, возможно, это было описано в некоторых других реализациях awk. – jparanich

1

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

BEGIN { 
    dates="AUG|SEP|OCT" 

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

}