Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ awk(1) — NEWS-os 4.1C

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

lex(1)

sed(1)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026