Loading AI tools
プログラミング言語のひとつ ウィキペディアから
AWK(オーク[1][2][3])は、プログラミング言語の一つ。 テキストファイル、特に空白類(スペースの他、タブなど)やカンマなどで区切られたデータファイルの処理を念頭に置いた仕様となっているが、一般的なプログラミングに用いることも可能である。UNIX上で開発された。
AWKのロゴ | |
登場時期 | |
---|---|
開発者 | アルフレッド・エイホ |
最新リリース | IEEE Std 1003.1-2008 / |
影響を受けた言語 | SNOBOL、Bourne Shell |
AWKは、ベル研究所におけるUNIX開発の過程で、sedやgrepのようなテキスト処理ツールに演算機能を持たせた拡張ツールとして1977年[4]に開発された。そのため、UNIX上のユーティリティである sort の存在を前提としている[4]。
簡単なスクリプトを記述することで効率的にテキストファイルを処理することが目的であった。 当初はそれほど多くの機能は無かったが、普及するにつれ、さまざまな処理をAWKで実行したいと考えるユーザーが増え、その希望に応えて1985年[4]に機能の拡張が行われた。その結果、汎用のプログラミング言語と比べても遜色が無いほどの機能を持つようになり、テキスト処理だけに留まらず、開発者も予想しなかったような大規模なプログラミングに使われるような例もあらわれた。一方、本来のテキスト処理用ツールとしても扱いやすく、現在でもCSV形式のファイルを簡易に処理する、などの目的で広く使用されている。
「AWK」という名称は、開発者であるアルフレッド・エイホ、ピーター・ワインバーガー、ブライアン・カーニハンの3人の苗字の頭文字を取って付けられたものであるが、AWKは「オーク」と読み、「エー・ダブリュー・ケー」と読んではならないと著者らはしている[注釈 1]。
また、全て小文字でawk
とした場合、Unix系OSないしPlan 9における、AWKのインタプリタ処理系プログラム自体(他の多くのコマンドと同じく全て小文字である)を指してそうしていることがある。
AWKのスクリプトは、パターンとアクションの組を並べた形になっている。
実行を開始すると、まずBEGIN
パターンのアクションを実行する。
以降、入力を読み込んでは、レコード分離文字(既定では改行)までを1レコードとし、ユニット分離文字(既定では連続するスペースまたは水平タブ)に従ってフィールドに分割してから、レコードがパターンにマッチするかを調べ、パターンにマッチしたらそのパターンに対応するアクションを実行する。
一致するパターンが複数ある時は、該当するアクションが上から順に全て実行される。これを入力が尽きるまで繰り返す。入力が尽きたら、END
パターンのアクションを実行し、終了する。すなわち、テキストストリームをシーケンシャルに読み込み、入力されるテキストストリームをレコードセパレータ毎に区切り、1行毎にスクリプトに記述されたアクションを順次実行する。
ファーストクラスのデータ型は、数値(全て倍精度浮動小数点型で扱われる)と文字列である。
他に文字列をキーとした連想配列があるが、連想配列はファーストクラスではなく関数の返戻値にできないなどデータというよりは、配列変数という変種の変数があるといったような扱いである。連想配列の中身(要素)を連想配列にすることはできないため、ループするようなデータ構造を作ることは不可能。連想配列のキーに数値を使うと、文字列に変換したものがキーとなる。
arr[x, y]
のようにして多次元配列のように見えるアクセスもできるが、実際には各次元を必要であればまず文字列化した後に、グローバル変数SUBSEP
の文字列(デフォルトではU+001C <control-001C>)をセパレータとして連結した文字列をキーとしてアクセスする。
スクリプトの基本構成は次のようになる。
BEGIN {
開始時処理
}
パターン1 {
アクション1
}
パターン2 {
アクション2
}
……
# コメント
END {
終了時処理
}
BEGIN
,END
アクションは必須ではない。
例として、テキストファイル内の全ての行のうち、空行の数と「林檎」・「りんご」または「リンゴ」という文字列を含む行の数をそれぞれ出力するAWKプログラムを示す。
BEGIN {
# 行の個数を表わす変数を宣言・初期化
blank_line = 0
bol_apple = 0
}
/^$/ {
++blank_line
}
/(林檎|りんご|リンゴ)/ {
++bol_apple
}
END {
print "空行は" blank_line "行です。"
print "「林檎」・「りんご」または「リンゴ」という文字列を含むのは" bol_apple "行です。"
}
なお、AWKでは、まだ代入されていない変数は暗黙のうちに0
または""
で初期化されると仮定してよいので、上の例でのBEGIN
ブロックは必須ではない。
パターンには以下のように開始と終了を定義するパターンもある。
/開始パターン/,/終了パターン/ {
アクション
}
例えば、以下のようなプログラムは、「<script>」を含む行から「</script>」を含む行まで(その行自身を含む)の間、指定されたアクションが実行する(この場合は単に行全体を出力する)。
/<script>/,/<\/script>/ {
print $0;
}
AWKの特徴の一つとして変数が型を持たないことが挙げられる。変数宣言が不要で、プログラム中で使用される変数は暗黙のうちに初期化される。このため、未定義変数や未初期化変数を参照することによるエラーはAWKには存在しない。
AWKは算術演算のような数値を必要とする文脈では暗黙に値を数値に変換し、逆に文字列を必要とする場合には文字列に変換する。 例えば、
a = "01"
b = 2
d = a + b
e = a + b + c
のような例では、d
およびe
の値は3
になる。
こうした暗黙の変換は便利であると同時に、利用者の意図しない結果を生むこともある。
また、変数に入っているのがどちらかわからないが、必ず数値が必要という場合などにx + 0
のように0を足したり、逆に必ず文字列が必要という場合などにx ""
のように""を結合させたりする、という常套手段がある。
AWKでは、関数を定義して使用することが可能である。
関数の定義は次のようになる。
function 関数名 (引数1, 引数2, ……)
{
命令文1
命令文2
……
}
AWKの変数は、引数を除いて全て大域変数であり、局所のスコープを持つのは引数として宣言された変数だけである。このため、技法として、関数定義で余分な引数を宣言し、それを局所変数として使う、ということが行なわれる。AWKでは、関数の呼び出し時に、実引数の個数が仮引数の個数より少なくても、省略とみなしエラーとしない。これを利用して、余分な引数を局所変数として使うのである。
function 関数名 (引数1, 引数2, 引数3, 局所変数1, 局所変数2, ……)
{
……
}
このように関数を定義した上で,呼び出すときに引数を3つしか使わなければ、局所変数1
以降は局所変数として扱える。構文上の区別は無いが、判読性を向上させるために両者の間に十分な空白を挿入するのが慣例になっている。
function 関数名 (引数1, 引数2, 引数3,
局所変数1, 局所変数2, ……)
{
……
}
また、関数は再帰呼び出しもできる。
AWKの制御構造には以下のようなものがある。
if (式) 式が真の時に実行される文
if (式) 式が真の時に実行される文 else 式が偽の時に実行される文
for (初期化式; 条件式; 更新式) 実行される文
for (変数 in 配列) 実行される文
while (式) 実行される文
do 実行される文 while (式)
break
continue
next
nextfile
return
exit
また、制御構造の他に、以下の文がある。
{文1; 文2; ……; 文n}
print
printf
delete
連想配列の全部ないし一部の要素を削除
もともとのAWKは、UNIXに付属していたものであったが、
様々なプラットフォームに移植された他、GNU AWK(gawk
)を代表に、他の実装も多い。
nawk
/usr/bin/awk
などはこれである。大きな機能追加などは以前から無いが、現在もメンテナンスされている[6]。 FreeBSD、NetBSD、OpenBSD、macOS、illumos、Android などで使用されている。gawk
awk
という名前のプログラムがこの実装であることが多い。POSIX 1003.2コマンド言語とユーティリティ規約に定められた言語の定義に適合している。マルチバイト文字への対応やネットワークへの接続機能など、オリジナルのAWKには無い多数の拡張が加えられており、現在もバージョンアップが続いている。jgawk
gawk
がマルチバイト文字に対応する以前に作られた gawk
の日本語文字対応拡張版。mawk
awk
に少数の拡張が加えられている。バイトコードに変換されて実行されるため,高速な動作が期待できる。またgawk
よりもバイナリサイズが小さい。mawk
MBCSmawk
のマルチバイト拡張。awk(1)
としてIEEE Std 1003.1-2017で標準化されている[7]。また、Linux Standard Baseでも指定コマンドになっている[8]。Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.