awk で配列を使う場合の注意点

awk の配列の添え字は数値と文字列の両方が使えますが、バグの元になることがあります。例えば、下記コードは配列の添字に数字を使う場合ですが、期待通りに動かないことがあります。

BEGIN {
  NumDataX = ENVIRON["NUM_DATA_X"];
  NumDataY = ENVIRON["NUM_DATA_Y"];

  for (i = 0; i < NumDataX; ++ i) {
    for (j = 0; j < NumDataY; ++ j) {
      data[i,j] = 0;
    }
  }
}
{
  a = $1;
  b = $2;
  data[a,b] = $3;END{
  for (i = 0; i < NumDataX; ++ i) {
    for (j = 0; j < NumDataY; ++ j) {
      printf "%d %d\n", data[i,j];
    }
  }
}

配列 data[a,b] の添字を $1, $2 から求める部分については、下記のように明示的に数値に変換する必要があります。

a = int($1);
b = int($2);

これと同様に、添字に文字列を使う場合には数値が混入しないようにしなければなりません。

配列を使っていてうまく動かない場合、awk コマンドの引数に --dump-variables を指定することで、利用している変数および配列の一覧を awkvars.out というファイルに出力することができます。このファイルには、変数については型と変数値が出力され、配列については要素数が出力されます。上記の例では、配列 data の要素数は NumDataX * NumDataY となっているかどうか確かめることで、問題を発見することができます。