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] と表記される)、 またはフィールドとすることができます。 変数はナル文字列に初期設定されます。 配列の添字は、 任意の文字列とすることができ、 必ずしも数値でなくても構いません。 これは、 連想メモリの形式を考慮しています (連想メモリの形で用意しています)。 文字列定数は 2重引用符(") で囲まれます。
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.1C