2010-08-24 39 views
2

想知道這是否可以在AWK中執行一段時間,但總是在過去解決它。將數組元素替換爲正則表達式語句/變量名稱

下面我初始化一個數組與3個月的一年...爲了可讀性我ommited其他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 
      } 
     } 
    } 

如果這些東西中的任何一個都可行,我非常感謝指針!

+0

您不想創建像「AUGseen」這樣的變量 - 動態變量名稱很討厭。你也應該使用一個數組:'seen [arr [i]] = 1' – 2010-08-24 20:02:07

回答

3

您可以使用match進行動態正則表達式。

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

如果我正確地理解了這個問題,那麼這是不響應的。如果$ 1匹配* arr的任何*元素,OP似乎想要匹配($ 1,arr)並且返回true。 – dmckee 2010-08-24 17:38:58

+0

經過測試,效果很好,如此upvoted。任何想法,如果動態變量名也是可行的? Thx – jparanich 2010-08-24 17:41:13

+0

dmckee,DarkDust正確無誤....我擔心它被誤解爲你的方式。 – jparanich 2010-08-24 17:42:56

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 2010-08-24 17:46:33

1

這裏是一個另類,它不使用數組。 (您可以將該陣列保留爲其他用途)

BEGIN { 
    dates="AUG|SEP|OCT" 

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

}