変数の型について

「データ処理に便利な機能」の章でもお話ししたように、AWKでは変数に型の概念がありません。・・・と言うか、全て文字列変数であると考えても良いでしょう。
それなのに数値演算もできるのです。AWKが勝手に数値であるか文字列であるかを判断し、演算によって自動的に型変換をするのです。

それでは実験してみましょう。
以下のスクリプトを作成して実行させてください。実行に必要な手順はもう大丈夫ですね。

BEGIN {
  a = "abc";
  b = 10;
  c = a + b;
  d = a b;
  print "a=" a, "b=" b, "c=" c, "d=" d;
}
BEGINブロック内の第1行目は、変数 a に文字列「abc」を代入しています。(文字列は " " で括る)
2行目は変数 c に数値 10 を代入しています。(" " で括っていない)
3行目は変数 a と b を加算して変数 c に代入しています。
4行目は変数 a と b を文字列として連結して変数 d に代入しています。
5行目は変数 a から d の内容を標準出力しています。(標準出力はプロンプト画面に出力される)

実行すると以下のように表示されます。
a=abc b=10 c=10 d=abc10
続行するには何かキーを押してください . . .
数値演算結果である変数 c は 10 となりました。文字列 abc は型変換の結果 0 となったことを示しています。
一方、文字列演算結果である変数 d は、予想通り文字列 abc10 となりました。

では、両方とも文字列の場合はどうなるでしょう。変数 a と b を以下のように変更しましょう。(他はそのまま)
  a = "abc";
  b = "10";
実行結果は・・・
a=abc b=10 c=10 d=abc10
続行するには何かキーを押してください . . .
演算結果は変化しませんね。演算前の変数の型には何ら影響されません。
では、変数 a と b を小数点を含んだ数字文字列にしてみましょう。
  a = "3.15";
  b = "10.55";
実行結果は・・・
a=3.15 b=10.55 c=13.7 d=3.1510.55
続行するには何かキーを押してください . . .
変数 c には数値演算の結果が正しく代入されています。変数 d は文字列の連結演算が行われました。
それでは、変数 a、b 両方を数値としてみましょう。
  a = 3.15;
  b = 10.55;
実行結果は・・・
a=3.15 b=10.55 c=13.7 d=3.1510.55
続行するには何かキーを押してください . . .
何ら問題ありません。
AWKでは演算前の変数の型には影響されず、数値演算なら数値に、文字列演算なら文字列にそれぞれ自動的に変換しているのです。
便利でしょう。

AWKはどのような条件で型変換するのでしょうか?
実験してみましょう。
数字と英字が混合した文字列同士を演算してみましょう。
  a = "3.15abc";
  b = "10.55xyz";
実行結果は・・・
a=3.15abc b=10.55xyz c=13.7 d=3.15abc10.55xyz
続行するには何かキーを押してください . . .
小数点を含んだ数字部分のみを数値として演算していますね。
次に、変数 a をちょっと変更しましょう。
  a = "a3.15bc";
  b = "10.55xyz";
実行結果は・・・
a=a3.15bc b=10.55xyz c=10.55 d=a3.15bc10.55xyz
続行するには何かキーを押してください . . .
・・・となってしまいました。
そうです。AWKは文字列の先頭が数字のときは数値に変換できるのですが、数字以外の時は数値 0 に変換します。
それでは先頭文字が小数点のときはどうなるでしょう?
変数 b を .55xyz としてみましょう。
  a = "3.15abc";
  b = ".55xyz";
実行結果は・・・
a=3.15abc b=.55xyz c=3.7 d=3.15abc.55xyz
続行するには何かキーを押してください . . .
・・・と、正しく数値演算されています。
うぅ〜む。。。 AWKは賢い!!

以上、面倒くさがり屋の私にとっての強い味方!! 変数の自動型変換のお話でした。。。

<-->

戻る