削除された内容 追加された内容
MetaNest (会話) による ID:44476338 の版を取り消し
編集の要約なし
1行目:
{{otheruses|スクリプト言語|自動車の架装企業|オートワークス京都}}
{{プログラミング言語}}
{{lang|en|'''AWK'''}}('''オーク''')は、{{lang|en|[[UNIX]]}} 上で開発された[[プログラミング言語]]で、[[CSV]]ファイルなどの文字ファイルの処理に用いられる。
 
== 概要 ==
{{lang|en|AWK}} は、[[ベル研究所]]における [[{{lang|en|UNIX]]}} 開発の過程で、{{lang|en|[[Sed (コンピュータ)|sed]]}}{{lang|en|[[grep]]}} のようなテキスト処理ツールに演算機能を持たせた拡張ツールとして開発された。
 
{{lang|en|AWK}} は、簡単なスクリプトを記述することで、効率的にテキストファイルを処理することを目的として開発された。当初はそれほど多くの機能は無かったが、普及するにつれ、さまざまな処理を {{lang|en|AWK}} で実行したいと考えるユーザーが増え、その希望に応えて機能の拡張が行われた。その結果、汎用のプログラミング言語と比べても遜色が無いほどの機能を持つようになり、テキスト処理だけに留まらず、開発者も予想しなかったような大規模なプログラミングに使われるような例もあらわれた。一方、本来のテキスト処理用ツールとしても扱いやすく、現在でも[[Comma-Separated Values{{lang|en|CSV]]}} [[ {{lang|en|TSV]]}} 形式のファイルを簡易に処理するなどの目的で広く使用されている。
 
名称の {{lang|en|AWK}} は、開発者である[[アルフレッド・エイホ]]、[[ペーター・ワインバーガ]]、[[ブライアン・カーニハン]]の3人の苗字の頭文字を取って付けられたものであるが、{{lang|en|AWK}} は「オーク」と読み、「エー・ダブリュー・ケー」と読んではならないと著者らはしている<ref>たとえばカーニハンによる『プログラミング言語{{lang|en|AWK}}』の日本語版序文に見られる。なお、同著の表紙には[[オオウミガラス]](GREAT({{lang-en-short|great AUK)auk}})が描かれており、これもその主張の強調である。</ref>。また、全て小文字で <code>awk</code> としたばあい、{{lang|en|UNIX}} ないし {{lang|en|Plan9}} における、{{lang|en|AWK}} のインタプリタ処理系プログラム自体(他の多くのコマンドと同じく全て小文字である)を指してそうしていることがある。
 
== {{lang|en|AWK}} の文法 ==
=== 基本構成 ===
{{lang|en|AWK}} のスクリプトは、パターンとアクションの組を並べた形になっている。実行を開始すると、まず <code>BEGIN</code> パターンのアクションを実行する。以降、入力を読み込んでは、レコードセパレータ(デフォルトでは行末)までを1レコードとし、フィールドセパレータに従ってフィールドに分割してから、レコードがパターンにマッチするかを調べ、パターンにマッチしたらそのパターンに対応するアクションを実行する。一致するパターンが複数ある時は、該当するアクションが上から順に全て実行される。これを入力が尽きるまで繰り返す。入力が尽きたら、<code>END</code> パターンのアクションを実行し、終了する。
 
プログラムが扱える[[データ型]]は、数値(全て倍精度浮動小数点型で扱われる)、[[文字列]]、[[連想配列]]である。添字を内部で文字列化してキーとして使うことで、連想配列を通常の[[配列]]のようにも使う。
 
{{lang|en|AWK}} スクリプトの基本構成は次のようになる。
 
<code>BEGIN {
(開始処理)
}
34行目:
END {
(終了処理)
}</code>
 
<code>BEGIN</code>、<code>END</code> アクションは必須ではない。
 
例として、テキストファイル内の全ての行のうち、「Obama<code>sheep</code>」という文字列を含む行の数をカウントするプログラムを以下に示す。
 
<code>BEGIN {
count = 0
}
/Obamasheep/ {
++count
}
END {
print "「Obamasheep」という文字列を含む行の数は " count " 行です。"
}</code>
 
なお、{{lang|en|AWK}} では、まだ代入されていない変数は暗黙のうちに <code>0</code> または <code>""</code> で初期化されると仮定してよいので、上の例での {{lang|en|BEGIN}} ブロックは必須ではない。
 
パターンには以下のように開始と終了を定義するパターンもある。
 
<code>/開始パターン/,/終了パターン/ {
アクション
}</code>
 
例えば、以下のように定義すると、<code>"Hello"</code> を含む行から、<code>"Bye"</code> を含む行まで(その行を含む)の間、アクションが実行されその行が出力される。
 
<code>/Hello/,/Bye/ {
print $0;
}</code>
 
=== 変数 ===
{{lang|en|AWK}} の特徴の一つとして変数が型を持たないことが挙げられる。変数宣言が不要で、プログラム中で使用される変数は暗黙のうちに初期化される。このため、未定義変数や未初期化変数を参照することによるエラーは {{lang|en|AWK}} には存在しない。
 
{{lang|en|AWK}} は算術演算のような数値を必要とする文脈では暗黙に値を数値に変換し、逆に文字列を必要とする場合には文字列に変換する。例えば、
<code>a = "01"
b = 2
c = "a"
d = a + b
e = a + b + c</code>
のような例では、<code>d</code> および <code>e</code> の値は <code>3</code> になる。
 
こうした暗黙の変換は便利であると同時に、ユーザの意図しない結果を生むこともある。
 
また、変数に入っているのがどちらかわからないが、必ず数値が必要という場合などに
<code>x + 0</code>
のように0を足したり、逆に必ず文字列が必要という場合などに
<code>x ""</code>
のように""を結合させたり、というイディオム常套手段がある。
 
=== 関数 ===
{{lang|en|AWK}} では、関数を定義して使用することが可能である。
 
関数の定義は次のようになる。
 
<code>function 関数名 (引数<sub>1</sub>, 引数<sub>2</sub>, …)
{
命令文<sub>1</sub>
命令文<sub>2</sub>
:
}</code>
 
{{lang|en|AWK}} の変数は、引数を除いて全て[[大域変数]]であり、局所のスコープを持つのは引数として宣言された変数だけである。このため、テクニックとして、関数定義で余分な引数を宣言し、それを局所変数として使う、ということがおこなわれる。{{lang|en|AWK}} では、関数の呼び出し時に、実引数の個数が仮引数の個数より少なくても、省略とみなしエラーとしない。これを利用して、余分な引数を局所変数として使うのである。
 
<code>function 関数名 (引数<sub>1</sub>, 引数<sub>2</sub>, 引数<sub>3</sub>, 局所変数<sub>1</sub>, 局所変数<sub>2</sub>, …)
{
}</code>
 
このように関数を定義して、この関数を呼び出すときに引数を3つしか使わなければ、局所変数1 以降は局所変数として扱える。構文上の区別は無いが、判読性を向上させるために両者の間に十分な空白を挿入するのが慣例になっている。
 
<code>function 関数名 (引数<sub>1</sub>, 引数<sub>2</sub>, 引数<sub>3</sub>, 局所変数<sub>1</sub>, 局所変数<sub>2</sub>, …)</code>
 
また、{{lang|en|AWK}} の関数は再帰呼び出しもできる。
 
=== 制御構造 ===
{{lang|en|AWK}} の制御構造は、C言語に由来しており、以下のようなものがある。
 
*<code>if</code> <code>(</code>式<code>)</code> 文<sub>T</sub>
133行目:
*<code>exit</code> (プログラムの実行を終了させる)
 
== {{lang|en|AWK}} の処理系 ==
オリジナルの <code>awk</code> は、{{lang|en|UNIX}} ツール群のなかの一つであったが、様々なプラットフォームに移植された他、現在ではUnix {{lang|en|UNIX}} 用にも {{lang|en|[[GNU]] AWK(}}(<code>gawk)</code>)をはじめとする他の実装が開発されている。
 
* '''one true awk''': エイホ、ワインバーガ、カーニハンによる AWK 。一つの真正の、といった感じで、他と区別する場合はone true awkなどと呼ばれる。日本ではくだけた感じで「元祖」などとも。(BSDでは本家Unixとは別の実装になっているtoolも多いが)[[FreeBSD]]の/usr/bin/awkなどはこれである。現在もメンテナンスされている。
* '''gawk''': [[GNU]] プロジェクトによる AWK の実装。GNU/Linuxディストリビューションではawkという名前でもこちらのことが多い。[[POSIX]] 1003.2 コマンド言語とユーティリティ規約に定められた言語の定義に適合している。[[マルチバイト文字]]への対応や[[コンピュータネットワーク|ネットワーク]]への接続機能など、オリジナルの awk には無い多数の拡張が加えられており、現在もバージョンアップが続いている。
** '''jgawk''': gawk がマルチバイト文字に対応する以前に作られた gawk の日本語文字対応拡張版。
* '''mawk''': Mike Brennan による AWK の実装。オリジナルの awk に少数の拡張が加えられている。
** '''mawk MBCS''': 木村浩一(ハンドル名 Bruce.)による mawk のマルチバイト拡張。
 
;{{lang|en|one true awk}}
* '''a2p''': AWK スクリプトを Perl スクリプトに変換するトランスレータ。Perl 配布キットに含まれている。
* '''one true awk''': エイホ、ワインバーガ、カーニハンによる {{lang|en|AWK }}。一つの真正の、といった感じで、他と区別する場合は {{lang|en|one true awk}} などと呼ばれる。日本ではくだけた感じで「元祖」などとも。(BSDでは本家Unix {{lang|en|UNIX}} とは別の実装になっているtoolも多いが){{lang|en|[[FreeBSD]]}} <code>/usr/bin/awk</code> などはこれである。現在もメンテナンスされている。
;<code>gawk</code>
* '''gawk''': {{lang|en|[[GNU]]}} プロジェクトによる {{lang|en|AWK}} の実装。{{lang|en|GNU/Linux}} ディストリビューションでは <code>awk</code> という名前でもこちらのことが多い。{{lang|en|[[POSIX]]}} 1003.2 コマンド言語とユーティリティ規約に定められた言語の定義に適合している。[[マルチバイト文字]]への対応や[[コンピュータネットワーク|ネットワーク]]への接続機能など、オリジナルの <code>awk</code> には無い多数の拡張が加えられており、現在もバージョンアップが続いている。
;<code>jgawk</code>
** '''jgawk''': <code>gawk</code> がマルチバイト文字に対応する以前に作られた <code>gawk</code> の日本語文字対応拡張版。
;<code>mawk</code>
* '''mawk''': マイク・ブレナン<ref>{{lang-en-short|Mike Brennan }}</ref>による {{lang|en|AWK}} の実装。オリジナルの <code>awk</code> に少数の拡張が加えられている。
;<code>mawk</code> {{lang|en|MBCS}}
** '''mawk MBCS''': 木村浩一<ref>ハンドル名 {{lang|en|Bruce.)}}</ref>による <code>mawk</code> のマルチバイト拡張。
;<code>a2p</code>
* '''a2p''': {{lang|en|AWK}} スクリプトを {{lang|en|Perl}} スクリプトに変換するトランスレータ。{{lang|en|Perl}} 配布キットに含まれている。
 
== 参考文献 ==
*{{Cite book|和書|author=A・エイホ|authorlink=アルフレッド・エイホ|coauthors=[[ブライアン・カーニハン|B・カーニハン]]・[[ペーター・ワインバーガ|P・ワインバーガー]]|year=1989|month=11|title=プログラミング言語{{lang|en|AWK}}|publisher=[[トッパン]]|isbn=4-8101-8008-5
}} - 「AWK book」(AWK 本)などと呼ばれ、C言語におけるK&Rのような扱いの本である。日本版は版元の出版事業撤退により最初に絶版となる。
*# [[新紀元社]]から復刊(2004年2月、ISBN 4-7753-0249-3)されたものの、2度目の絶版となる<ref>http://w3.shinkigensha.co.jp/books/4-7753-0249-3.html</ref>。
*# [[ユニバーサル・シェル・プログラミング研究所]]から2010年1月に2度目の復刊(ISBN 978-4-904807-00-2)がなされた<ref>http://www.usp-lab.com/pub/book.awk.html</ref>。
*{{Cite book|和書|author=志村拓|authorlink=志村拓|coauthors=[[鷲北賢]]・[[西村克信]]|year=1993|month=3|title={{lang|en|AWK}}を256倍使うための本|publisher=[[アスキー (企業)|アスキー]]|isbn=4-7561-0162-3|url=http://ascii.asciimw.jp/books/books/detail/4-7561-0162-3.shtml}} - アスキーの256本のひとつで、通称「AWK256本」とも呼ばれており、現在も販売中のベストセラーである。
*{{Cite book|和書|author=Dale Dougherty|authorlink=デール・ドゥラティ|others=[[福崎俊博]]訳|coauthors=[[アーノルド・ロビンス|Arnold Robbins]]|year=1997|month=10|title={{lang|en|sed}}{{lang|en|awk}} プログラミング 改訂版|publisher=[[オライリー・ジャパン]]|isbn=4-900900-58-3|url=http://www.oreilly.co.jp/books/4900900583/}}
*{{Cite book|和書|author=Arnold Robbins|authorlink=アーノルド・ロビンス|others=[[福崎俊博]]訳|year=2000|month=7|title={{lang|en|sed}}{{lang|en|awk}} デスクトップリファレンス|publisher=[[オライリー・ジャパン]]|isbn=4-87311-017-3|url=http://www.oreilly.co.jp/books/4873110173/}}
 
== 関連項目 ==
* [[sed (コンピュータ)|{{lang|en|sed}} (コンピュータ)]]
* {{lang|en|[[Perl]]}}
* {{lang|en|[[Ruby]]}}
 
== 脚注 ==
162 ⟶ 167行目:
 
== 外部リンク ==
* [http://www.linux.or.jp/JM/html/GNU_gawk/man1/gawk.1.html {{lang|en|Manpages of GAWK}}](日本語)
* [http://docs.sun.com/app/docs/doc/819-1210/awk-1?l=ja&a=view {{lang|en|<code>awk</code>(1)}}] {{lang|en|man page(SunOSpage}}({{lang|en|SunOS}} リファレンスマニュアル)
* [http://docs.sun.com/app/docs/doc/819-1210/nawk-1?l=ja&a=view {{lang|en|<code>nawk</code>(1)}}] {{lang|en|man page(SunOSpage}}({{lang|en|SunOS}} リファレンスマニュアル)
* [http://docs.hp.com/ja/B2355-60128/awk.1.html {{lang|en|<code>awk</code>(1)}}] {{lang|en|man page(HPpage}}({{lang|en|HP-UX}} リファレンス)
* [http://www.kt.rim.or.jp/%7Ekbk/gawk-30/gawk_toc.html {{lang|en|Effective AWK Programming}}] - {{lang|en|A User's Guide for GNU Awk}} の日本語訳]
* [http://www.osaka-kyoiku.ac.jp/~kokugo/nonami/awk/awkmini.html AWK{{lang|en|AWK}} のまとめ 弘前大学 教育学部 教育実践研究指導センター 小山智史氏]
* [http://doc.cat-v.org/henry_spencer/amazing_awk_assembler/ {{lang|en|aaa - the Amazing Awk Assembler by Henry Spencer}}](英語)
 
{{Unixコマンド}}