AWKはとても小さな言語で、基本的なデータ型もわずかしかありません。 このレッスンでは、数値と文字列について見ていきます。
AWKの数値は、倍精度浮動小数点数として実装されています。 整数、小数、倍精度浮動小数点数の間に区別はありません。
AWKは8進数の定数(0で始まるもの)と16進数の定数(0xまたは0Xで始まるもの)を理解します。
標準的な算術演算子である+、-、*、/、%を使えます。
べき乗の演算子は^です。
組み込みの数値関数もいくつかあり、三角関数や乱数生成、数値を_x_と0の間で最も近い整数に切り捨てるint(x)などがあります。
AWKの文字列は、文字の並びです。 文字列の定数は、二重引用符で囲んで指定します。
文字列の操作は、連結の1つだけです。 連結には専用の演算子はありません。2つの文字列を並べるだけで、それらは連結されます。
BEGIN {
hw = "Hello" "World"
print hw
}
# => HelloWorld
printは文であって、関数ではありません。
printに括弧(())は必要ありません。
AWKには、文字列を操作するための関数が豊富に用意されています。 これらについては、トラックを進めていく中で詳しく紹介していきます。
数値と文字列を変換する明示的な演算子はありません。 AWKは、プログラムの文脈に応じてこれを暗黙的に行います。 そのため、入力フィールドの値を扱うのはとても簡単です。AWKはたいてい、こちらが望んだとおりに動いてくれます。
print x + yは、+の数値演算のおかげで、xとyの変数の値を数値に変換します。print x yは、連結の操作によって、xとyの変数の値を文字列に変換します。明示的に行いたい場合は、0 + xで_x_の数値としての表現が得られ、"" xで_x_の文字列としての表現が得られます。
AWKが文字列を数値に変換する方法は、戸惑うこともあるかもしれません。 簡単に言うと、AWKは文字列の先頭から「数値の文字」を読み進め、数値ではない文字が見つかったところで止まります。 いくつか例を挙げます。
"2.5"は数値の2.5に変換されます。"1e3"は数値の1000に変換されます(指数表記)。"456abc"は数値の456に変換されます(aは数値ではないため、そこで変換が止まります)。"abc789"は数値の0に変換されます(文字列の先頭に数字がないためです)。友人が庭のあちこちで取った測定値からレポートを作成するのを手伝っています。 残念ながら、友人はそのデータを奇妙な形式で保存していました。 それぞれの測定値は、カンマで区切られた複数のフィールドの集まりです。 ただし、2桁の数値は2つの列に分けて保存されています。
| フィールド番号 | 意味 |
|---|---|
| 1 | ID番号 |
| 2 | 場所 |
| 3 | 1つ目の測定値の十の位 |
| 4 | 1つ目の測定値の一の位 |
| 5 | 2つ目の測定値の十の位 |
| 6 | 2つ目の測定値の一の位 |
101,house,4,2,5,4のような入力行なら、
42、54です。2つの測定値の平均を求め、各行の結果を次の形式で出力します。
#<id>, <label> = <average>
42と54の平均は48なので、この例の行の出力は次のようになります。
#101, house = 48