awk:変数でフィールドアクセスする際のメモ
優先順位操作の()を付けないパターン
echo 1 3 5 | awk '{_=1; print $_++; print $1, $_}'#シェル芸
— ot2sy39 (@ot2sy39) 2018年6月12日
— シェル芸bot (@minyoruminyon) 2018年6月12日
変数_に1を代入。
最初のprint。$_すなわち$1、つまり
1
を出力。そして$1をインクリメントし2に。変数_は1のまま。2個目のprint。$1と$_、つまり$1を2回出力。$1は2になってるので、
2 2
と出力される。
フィールド参照演算子の後に()を付けるパターン
echo 1 3 5 | awk '{_=1; print $(_++); print $1, $_}'#シェル芸
— ot2sy39 (@ot2sy39) 2018年6月12日
— シェル芸bot (@minyoruminyon) 2018年6月12日
変数_に1を代入。
最初のprint。$_すなわち$1、つまり
1
を出力。そして変数_をインクリメントし2に。$1は1のまま。2個目のprint。$1と$_、つまり$1と$2を出力。出力は
1 3
。
フィールドが非数値の場合
echo a 3 5 | awk '{i=1; print $i++; print $1, $i}'#シェル芸
— ot2sy39 (@ot2sy39) 2018年6月12日
— シェル芸bot (@minyoruminyon) 2018年6月12日
変数iに1を代入。
最初のprint。$iすなわち$1を出力するのだが、$1にインクリメント演算子がついているため数字にキャストされてしまうようで、aではなく0になってしまう。$1は0をインクリメントした1に。iは1のまま。
2個目のprint。$1と$i、つまり$1と$1を出力。$1は1になっているので、出力は
1 1
考察
$1="a"
な状態で、print $1++
が0を出力するのが、意外というか直感に反するというか。
ポストインクリメント演算子は評価したあとにインクリメントするのだから、
print $1++
はaを出力し、その後$1=1
になるなら分かるんだけど。
型キャストの方が先に行われてしまうのね。