AWKのまとめ

弘前大学 教育学部 教育実践研究指導センター
小山智史

AWKプログラム

 「AWKプログラム」は、「パターン−アクション規則」と「関数定義」の並びである。

パターン{アクション}
パターン{アクション}
...
function 名前(引数の並び){ 文 }
function 名前(引数の並び){ 文 }
...

パターン−アクション規則や関数定義の前後に空行を挿入してもよい。関数定義はどこに記述してもよい。
 入力レコードをひとつ読む度に、パターン−アクション規則のパターンが順に検査される。パターン−アクション規則は、パターンが真となるレコードに対して、対応するアクションが実行される。
 パターンあるいは{アクション}のいずれかを省略することができる。パターンを省略するとすべてのレコードにアクションが実行され、{アクション}を省略するとパターンが真となるレコードを表示する。

パターン

 「パターン」は次のいずれかである。

アクションと文

 「アクション」は文の並びである。
 文は次のいずれかである。

文は改行か';'で区切る。';'が単独で用いられると、空文を表す。文の前後には空行を挿入してもよい。
 長い文は、行末に'\'を置いて次行に続けることができる。", { && || do else"のあと、および"if( )","for( )"のあとは、'\'を置かずに改行しても継続とみなされる。

制御文

 制御文は次のいずれかである。

 if-else文において、最初の文がelseと同じ行にある場合、この文は';'で終了するか"{ }"で囲まなければならない。

基本的な制御構造

文の種類記法
逐次構造(文の並び){文1; 文2; ... 文n}
選択構造(if文)if(式) 文
選択構造(if-else文)if(式) 文1 else 文2
ループ構造(for文)for(式1; 式2; 式3) 文
ループ構造(while文)while(式) 文
ループ構造(do-while文)do 文 while(式)

入出力文

 入出力文は次のとおりである。

getline入力レコードを"$0"にセット
getline 式0または1
文の種類書式戻り値
比較式>=式0または1
式!=式0または1
式==式0または1
配列要素式 in 式0または1
パターンの検査式~/正規表現/0または1
式!~/正規表現/0または1
式+式演算結果
式-式演算結果
式*式演算結果
式/式演算結果
剰余式%式演算結果
累乗式^式演算結果
+式
-式
(式)
文字列連接文字式 文字式文字列

組み込み変数

 次の組み込み変数が用意されている。

組み込み変数
ARGCコマンド行の引数の数
ARGVコマンド行の引数の配列
FILENAME現在の入力ファイル名
ENVIRON["..."]環境変数の値
FS入力のフィールドセパレータ(はじめはスペースまたはタブ)
RS入力のレコードセパレータ(はじめは改行)
NF現在レコードのフィールド数
NR現在の通算レコード
FNR現在の入力ファイルの通算レコード
OFS表示のフィールドセパレータ(はじめはスペース)
ORS表示のレコードセパレータ(はじめは改行)
OFMT数の表示のフォーマット(はじめは"%.6g")
RSTARTmatchでマッチした文字列の開始位置
RLENGTHmatchでマッチした文字列の長さ
$0現在の入力レコード
$1,...,$NF第1フィールド,...,第NFフィールド

組み込み文字列関数

組み込み文字列変数
gsub(r,s,t)文字列tの中に現れる文字列rをすべて文字列sで置換する.置換した数を返す.tを省略すると$0が使われる.
index(s,t)文字列sの中の文字列tの位置を返す.tが現れない場合は0.
jindex(s,t)日本語文字列sの中の文字列tの位置を返す.tが現れない場合は0.
length(s)文字列sの長さを返す.
jlength(s)日本語文字列sの長さを返す.
match(s,r)文字列sが文字列rにマッチする位置を返す.マッチしないときは0.
split(s,a,fs)fsをフィールドセパレータとして文字列sを配列aに分解し、フィールド数を返す.
sprintf(書式,式)書式で整えた式の並びを返す.
sub(r,s,t)gsub()と同様.ただしはじめの1回だけ置換する.
substr(s,i,n)文字列sのi番目から始まるn文字を返す.
jsubstr(s,i,n)日本語文字列sのi番目から始まるn文字を返す.

組み込み算術関数

組み込み算術変数
atan2(y,x)atan(y/x)で-π〜πの値.
sin(x)sin関数
cos(x)cos関数
exp(x)exp関数
log(x)自然対数
sqrt(x)平方根
int(x)小数点以下を切り捨て
rand()疑似乱数 0以上1未満
srand()乱数の初期化

書式変換

 printfとsprintfの中では次のような変換が利用できる。ここでは例で示す。

記法
printf("|%c|",65) |A|
printf("|%d|",65) |65|
printf("|%5d|",65) | 65|
printf("|%05d|",65) |00065|
printf("|%f|",65) |65.000000|
printf("|%5.1f|",65) | 65.0|
printf("|%e|",65) |6.500000e+01|
printf("|%5.1e|",65) |6.5e+01|
printf("|%g|",65) |65|
printf("|%o|",65) |101|
printf("|%s|","hirosaki") |hirosaki|
printf("|%10s|","hirosaki") | hirosaki|
printf("|%-10s|","hirosaki") |hirosaki |
printf("|%.4s|","hirosaki") |hiro|
printf("|%10.4s|","hirosaki") | hiro|
printf("|%-10.4s|","hirosaki") |hiro |
printf("|%%|") |%|

正規表現

 例で正規表現の記法を示す。通常これらの組み合わせとなる。

記法
AAそのもの(以下の特殊文字を除く普通の文字)
\\\そのもの
\""そのもの
\tタブ
\n改行
\fフォームフィード
\bバックスペース
\0338進数033
^a文字列の先頭が'a'
a$文字列の末尾が'a'
.任意の1文字
[abc]'a''b''c'のどれか1文字
[^abc]'a''b''c'以外の1文字
[a-e]'a''b''c''d''e'のどれか1文字
[^a-e]'a''b''c''d''e'以外の1文字
a*0個以上の'a'の並び
a+1個以上の'a'の並び
a?'a'が1個あるいは0個
abc|de"abc"または"de"