AWK(1) — NEWS-OS Programmer’s Manual
名称
awk − パターン検査および処理言語
形式
awk [ −Fc ] [ prog ] [ file ] ...
解説
awk は、 各入力 file を走査し、 prog に指定された 1 組のパターンのいずれかに一致する行を探します。 prog の各パターンを使用して、 file の行がそのパターンに一致したときに 遂行されるアクションを対応付けることができます。 パターンの集まりは、 文字どおりに prog として指定することもできますが、 −f file として指定されるファイル内に収めておくこともできます。
ファイルは順番に読み取られます。 ファイルがない場合には、 標準入力が読み取られます。 ファイル名 − は標準入力を意味します。 各行は、 パターン−アクション文のパターンの部分と比較されます。 対応付けらているアクションは、 一致したパターンごとに実行されます。
入力行は、 スペースで区切られた複数のフィールドから構成されています。 (このセパレータのデフォルトは、 FS を使用することによって変更することができます。以降参照) フィールドは、 $1、$2、 ... のように表記されます。 $0 は行全体を意味します。
パターン−アクション文の形式は次のとおりです。
パターン { アクション }
{ アクション } が省略された場合には、一致した行が出力されます。 パターンが省略されると、常に一致することになります。
アクションは文が順に並べられたものです。 文は、次のうちのいずれかです。
if ( 条件 ) 文 [ else 文 ]
while ( 条件 ) 文
for ( 式 ; 条件 ; 式 ) 文
break
continue
{ [ 文 ] ... }
変数 = 式
print [ 式リスト ] [ >式 ]
printf フォーマット [ , 式リスト ] [ >式 ]
next # この入力行に関して残りのパターンをスキップする
exit # 入力の残りの部分をスキップする
文は、 セミコロン、復帰改行、右中かっこ (}) で終了させます。 空の式リストは行全体を意味します。 式は、文字列または数値をとり、演算子 +、−、∗、 /、% と連結 (空白によって示される) を使用して作られます。 C の演算子 ++、−−、+=、 −=、∗=、/=、 %= も式の中で使用することができます。 変数は、スカラ、配列要素 (x[i] と表記される)、 またはフィールドとすることができます。 変数はナル文字列に初期設定されます。 配列の添字は、 任意の文字列とすることができ、 必ずしも数値でなくても構いません。 これは、 連想メモリの形式を考慮しています (連想メモリの形で用意しています)。 文字列定数は二重引用符(") で囲まれます。
print 文は、 引数を現在の出力フィールドセパレータで区切り、 出力レコードセパレータで終了させて、 標準出力 (>file がある場合はファイル) に出力します。 printf 文は、フォーマットに従って式のリストをフォーマッティングします (printf(3S) 参照)。
組込み関数 length は、 文字列と見なされる引数の長さを返します。 引数がない場合には、 行全体の長さを返します。 また、組込み関数には、 exp、 log、 sqrt、 int もあります。 最後の関数 int は、 引数の小数点以下を切り捨てて整数にします。
substr(s, m, n)
文字列 s の位置 m から始まる n キャラクタの部分文字列を返します。
sprintf(fmt, expr, expr, ...)
fmt で与えられた printf(3S) のフォーマットに従って式をフォーマッティングし、 結果として得られる文字列を返します。
パターンは、 (!、||、&&、 およびかっこを使用した)正規表現と関係式の任意の論理的な組合せです。 正規表現は、スラッシュで囲まねばならず、 egrep のものと同じです。 パターン内の独立した正規表現は行全体に適用されます。 また、正規表現を関係式に含めることもできます。
1 つのパターンは、 コンマで区切られた 2 つのパターンから構成することができます。 その場合、アクションは、 最初のパターンの出現箇所と 2 番目のパターンの次の出現箇所の間の すべての行について実行されます。
関係式は、次のいずれかです。
式 matchop 正規表現
式 relop 式
ここで、 relop は C の 6 種類の関係演算子のいずれかであり、 matchop は ~ (包含する) または !~ (包含しない) のいずれかです。 条件は、数式、関係式、またはこれらの論理的な組合せです。
特殊なパターン BEGIN と END を使用して、 最初の入力行が読み取られる前と最後の行が読み取られた後に、 制御を捕らえることができます。 BEGIN は最初のパターン、 END は最後のパターンとなっていなければなりません。
プログラムを次のように開始した場合は、 単一のキャラクタ c を使用してフィールドを区切ることができます。
BEGIN { FS = "c" }
これは、 −Fc オプションを使用しても同じです。
特別な意味を持つ他の変数名には次のものがあります。
NF現在のレコードのフィールド数
NR現在のレコードの番号
FILENAME現在の入力ファイル名
OFS出力フィールドの分離記号(デフォルトは空白)
ORS出力レコードの分離記号(デフォルトは復帰改行)
OFMTおよび数値の出力フォーマット(デフォルトは %.6g)
多国語対応
漢字をはじめ多国語のテキストファイルに対応するための処理は、 以下のとおりです。
次の各関数に 2 バイトコードを使用したときの処理を示します。
length(s)
文字列 s をバイト単位で数えます。
substr(s, m, n)
m、n で指定された数字はバイト数を示す。 2 バイトコードは 1 文字として扱われます。 m、n で指定されたところに、2 バイトコードの第 1 バイトだけが来た場合、 その文字は選択されません。
index(s1, s2)
s2 が s1 内に現われた場所をバイト数で返します。
split(s, array, sep)
sep に 2 バイトコードを指定することができます。
新たに追加された関数は、次のとおりです。
jlength(s)
文字列 s を文字単位で数えます。
jsubstr(s, m, n)
m、n で指定された数字は文字数を示す。 2バイトコードは 1文字として扱われます。
jindex(s1, s2)
s2 が s1 内に現われた場所を文字数で返します。 このとき 2 バイトコードは 1 文字として数えられます。
レコードセパレータ (RS, ORS)、 フィールドセパレータ (FS, OFS) に 2 バイトコードを指定できます。 −F オプションでフィールドセパレータに 2 バイトコードを 指定することもできます。
正規表現は、文字単位で処理されます。
例
72 キャラクタより長い行を出力する場合は、次のようにします。
length > 72
最初の 2つのフィールドを 逆の順序で出力する場合は次のようにします。
{ print $2, $1 }
最初のカラムを加算して 合計と平均を算出する場合は次のようにします。
{ s += $1 }
END{ print "sum is", s, " average is", s/NR }
すべてのフィールドを逆の順序で出力する場合は次のようにします。
{ for (i = NF; i > 0; --i) print $i }
start と stop のペアの間にあるすべての行を出力する場合は次のようにします。
/start/,/stop/
最初のフィールドが前の行のフィールドと異なっている すべての行を出力する場合は次のようにします。
$1 != prev { print; prev = $1 }
関連事項
lex(1), sed(1)
A. V. Aho, B. W. Kernighan, P. J. Weinberger, awk − a pattern scanning and processing language
バグ
数値と文字列の間の明示的な変換はありません。 式を数値として扱わせるためには、 式に 0 を加えてください。 式を文字列として扱わせるためには、 式に "" を連結してください。
NEWS-OSRelease 4.2.1R