Go to the first, previous, next, last section, table of contents.

フィールド内容の変更

awkによって定義されたフィールドの内容は、awkプログラムで変更できます。awkプログラムは、現在の入力レコードに対して変更を行います(実際の入力は変更されません。awkは決して入力ファイルを変更しません)。

次の例を見てください。

awk '{ $3 = $2 - 10; print $2, $3 }' inventory-shipped

`-'符号は減算を表します。したがって、このプログラムは2番目のフィールドの値から10を引いて$2 - 10、3番目のフィールド$3に再代入しています(See section 算術演算子)。次に、フィールド2と、フィールド3の新しい値を表示します。

上記の例が動作するためには、フィールド$2のテキストは数として認識されなければなりません。つまりコンピュータが算術演算が行えるように、文字列は数に変換されなければなりません。減算の結果の数は変換されて、フィールド3となる文字列に戻されます。See section 文字列と数の変換

フィールド(awkから見た)の値を変更した場合、入力レコードのテキストは再計算され、古いフィールドだった場所に新しいフィールドが含められます。したがって、$0は変更されたフィールドを反映するために変更されます。次の例を見てください。

awk '{ $2 = $2 - 10; print $0 }' inventory-shipped

これは、入力ファイルの各行の2番目のフィールドから10を引いて表示します。

また、範囲外のフィールドに内容を代入することもできます。次の例を見てください。

awk '{ $6 = ($5 + $4 + $3 + $2) ; print $6 }' inventory-shipped

この例では、フィールド$2$3$4$5の合計がその値となる、$6が作成されます。+符号は加算を表します。`inventory-shipped'ファイルの場合、$6は特定の月に出荷された荷物の総数を表します。

新しいフィールドが作成されると、awkの内部にある現在の入力レコード$0の値のコピーが変更されます。したがって、フィールドを追加したあとに`print $0'を行うと、表示されるレコードには新しいフィールドが含まれ、そのフィールドとその前の既存のフィールドとの間には適切な数のフィールドセパレータが出力されます。

この再計算が行われると、まだ説明していないいくつかの機能、特にフィールドを区切るために使われる出力フィールドセパレータOFS(see section フィールドを調べる)とNF(フィールド数。see section フィールドを調べる)に影響を与えますし、また、それらの機能も再計算に影響を与えます。たとえば、NFの値は、作成された一番大きなフィールド番号に設定されます。

しかし、範囲外のフィールドを参照しても、$0の値もNFの値も変更されないことに注意してください。範囲外のフィールドを参照すると、ヌル文字列が発生するだけです。たとえば、次の例は、

if ($(NF+1) != "")
    print "can't happen"
else
    print "everything is normal"

`everything is normal'を表示するはずです。なぜなら、NF+1はまちがいなく範囲外だからです(awkif-else文の詳細については、See section if)。


Go to the first, previous, next, last section, table of contents.