将数组元素替换为正则表达式语句/变量名称

时间:2010-08-24 17:14:53

标签: awk gawk

想知道这在AWK中是否可行一段时间,但过去总是在解决它。

下面我用一年中的3个月初始化一个数组...为了便于阅读,我在其他9个月内省略了。这些月份然后在if语句中用作正则表达式的一部分,但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
            }
        }
    }

如果这些事情中的任何一个都可行,我非常感谢指针!

3 个答案:

答案 0 :(得分:3)

您可以将match用于动态正则表达式。

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

答案 1 :(得分: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;
}

答案 2 :(得分:1)

这是另一种选择,它不使用数组。 (您可以将阵列保留用于其他目的)

BEGIN {
  dates="AUG|SEP|OCT"

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

}