3

しばらくの間、これが AWK で実行可能かどうか疑問に思っていましたが、過去には常に回避していました。

以下では、1 年の 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
            }
        }
    }

これらのいずれかが実行可能である場合、私はポインターに大いに感謝します!

4

3 に答える 3

3

match動的正規表現に使用できます。

if(match($1, arr[i]))
于 2010-08-24T17:29:50.907 に答える
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;
}
于 2010-08-24T17:42:58.607 に答える
1

これは別の方法です。配列を使用しません。(他の目的のために配列を保持できます)

BEGIN {
  dates="AUG|SEP|OCT"

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

}
于 2010-08-25T00:25:23.947 に答える