- Alfred V. Aho, Brian W. Kernighan & Peter J. Weinberger, 1988, 2024: The AWK Programming Language. Second Edition. Hoboken NJ USA: Addison-Wesley (Pearson Education).
- [初版の日本語版] A. V. エイホ、B. W. カーニハン、P. J. ワインバーガー 著, 足立 高徳 訳, 1989: プログラミング言語 AWK (アジソン ウェスレイ ・ トッパン 情報科学シリーズ)。トッパン, 301 pp. ISBN 4-8101-8008-5.
- [第2版の日本語版] Alfred V. Aho [エイホ], Brian W. Kernighan [カーニハン] & Peter J. Weinberger 著, 千住 治郎 訳, 2024: プログラミング言語 AWK 第2版。オライリー ジャパン, 254 pp. ISBN 978-4-8144-0070-6.
プログラム言語 AWK [オーク] の名まえは作者の頭文字をならべたものだが、本書は同じ3人が著者になった (順序はAKW になっているが) いわば「AWKの原典」というべき本だ。36年ぶりに第2版が出た。
【わたしは1989年ごろ以来、おそらくいちばん多数回起動してきた言語処理系がAwk だ、実行時間では Fortran のほうが長いが、Awk はこまかい処理につかうからだ。Awk は入力を1行ずつ読んで結果を出力するのが標準的なつかいかたなのだが、BEGIN部だけをつかい、からっぽの入力ファイルを読ませるという邪道なつかいかたもした (ウェブページ集 [Awk使い 正道邪道])。Awkに熟練してしまったので Perl には手をださなかった。しかし2021年以後は、教材作成を Python に集中させているので、これまで Awk で書いてきたことを Python で書くことがおおくなっている。】
第2版の日本語版は2024年5月14日の新刊。横はB5と同じ、縦はA5よりすこし長めの寸法の横書きのペーパーバック。
初版の日本語版は A5判横書きのペーパーバック。トッパンが出版事業をやめてしまって絶版になったあと、(CiNii Books を参考にすると) 2001年にCMC出版部、2004年に新紀元社、2010年にUSP研究所から復刊されている。わたしの手もとにあるのは1994年のトッパンの第9刷だが、わたしはたぶん日本語版の出版まもないころに目をとおしていた。ただしAwk言語を「この本で」まなんだのではなく、このころ (1980年代後半) GNU Awk (gawk) 処理系のMS-DOS版の NEC PC9801 のMS-DOS でも動くものがフリーで配布されたので試行錯誤的につかいはじめ、この本をときどき参照したのだった。
目次の書きぬきをしてみると、初版の第1章は第2版の第1章、初版の第3-8章はひとつずつずれて第2版の第4-9章に対応し、節の表題をみるかぎりでは内容も対応しているようだ。(ただし訳語が、初版の足立さんが漢字からくみたてた語をつかうことがおおいのに対して、第2版の千住さんは英語からかたかなにしていることがおおい。) 初版の第2章は言語仕様の紹介であり、初版の付録Aとあわせて、第2版の付録Aとなっている。(あとにつける目次書きぬきでは、第2版の付録Aと初版の第2章を対応させた。)
第2版で追加された第2章と第3章には、短いスクリプトでできる、もうすこしがんばれば実用にやくだちそうな応用例がならんでいる。とくに第3章では、探索型データ解析がこころみられている。(著者たちがつとめていた Bell 研究所は、統計学者 Tukey 博士がプリンストン大学と兼任で所属していたところでもあり、その影響があるとおもう。)
Kernighan氏による第2版日本語版まえがきで特記されている新機能として、CSV (コンマくぎりで値が収録されたファイル) からのデータ入力 (A.5.2) と文字コードの Unicode への対応 (3.4節) がある。著者たちが開発しているAwk処理系にこの機能を追加したので、それをきっかけに本のほうも新版にしたらしい。【わたしは、AwkでCSVファイルをあつかうために数十行のプログラムを書いてつかいまわしていたし (ウェブページ [コンマ区切りのデータ])、文字コードでは苦労してきたので (ウェブページ [Awkによる日本語文字の処理 (メモ)])、AWK言語でのあつかいがさだまったのはうれしい。しかし実際にためしてみるにはいたっていない。】
本書の紹介からははずれるが、ついでに、手もとにある本書以外のAwk言語の本をあげておく。
- Arnold D. Robbins, 1997: Effective AWK Programming. Second Edition. Seattle WA USA: Specialized Systems Consultants (SSC). ISBN 1-57831-000-8. … The GAWK Manual として 1989年から改版をかさね、おそらく 1996年にこの書名・著者名の本となった。わたしはオンラインドキュメントの GAWK Manual をよく参照した。紙の本書も買ったのだがあまりつかわなかった。
- Doug Dougherty & Arnold Robbins, 1990, 1997: sed & awk. Second Edition. O’Reilly.
[日本語版] Doug Dougherty & Arnold Robbins 著, 福崎 俊博 訳, 1991, 1997: sed & awk プログラミング 改訂版。オライリー ジャパン, 461 pp. ISBN 4-900900-58-3. … わたしは日本語版の「改訂版」をもっている。参照しようとおもって買ったのだがあまりつかわなかった。 - 志村 拓、鷲北 賢、西村 克信, 1993: AWKを256倍使うための本。アスキー出版局, 277 pp. ISBN 4-7561-0162-3. … プログラマーの娯楽的なシリーズのAWK言語の巻。おもしろいと思って読んだ。Awkの邪道なつかいかた (BEGIN部だけをつかい、からっぽの入力ファイルをわたすなど) の参考にしたおぼえがある。
- 伊藤 博康, 1992: 入門 JGAWK — サンデープログラマーのための言語型テキスト変換プログラム。エーアイ出版, 175 pp. ISBN 4-87193-171-4. … 日本語MS-DOS上でシフトJIS文字コードのデータをあつかうわざの参考になった。
目次書きぬき
日本語版の目次を書きぬき、第2版を左、初版を右におき、横にならべてみた。(フォントの幅が漢字・かながアルファベットの2倍であることを想定しているところがあり、そうでない環境では残念ながら読みにくい。) 対応するものがあるところは第2版と第1版のあいだに「#」の字をはさみ、対応するものがないところは第2版・第1版それぞれについて「@」の印をつけた (ただし第2版だけにある項目の第1版については省略)。階層の段さげも、このブログでは空白ではしめせないので、「-」をいれてしめしている。
===== 目次 ===== 第2版 日本語版まえがき @ @ # 訳者の序 まえがき # 序 - - 本書の構成 # - - この本の構成 - - プログラム例 # - - 例 - - Awk の進化 # - - Awk言語の変遷 - - 謝辞 @ - - 初版の謝辞 # - - 謝辞 目次 # 目次 1章 Awkチュートリアル # 第1章 AWK入門 - 1.1 さあ始めよう # - 1-1 手はじめに - - Awk プログラムの構造 # - - AWK プログラムの構造 - - Awk プログラムの実行 # - - AWK プログラムの実行 - - エラー # - - エラー - 1.2 簡単な表示 # - 1-2 単純な出力 - - 全入力行の表示 # - - 全部の行の印字 - - フィールドの表示 # - - 特定の欄の印字 - - NF: フィールド数 # - - 欄の数 NF - - 計算と表示 # - - 計算と印字 - - 行番号の表示 # - - 行番号の印字 - - テキストの挿入 # - - 文章の出力 - 1.3 書式付き表示 # - 1-3 凝った出力 - - フィールドの整形 # - - 欄の模様がえ - - 出力のソート # - - 出力の整列 - 1.4 選択 # - 1-4 選択 - - 比較による選択 # - - 比較による選択 - - 計算による選択 # - - 計算による選択 - - テキスト内容による選択 # - - 文の中身による選択 - - パターンの組み合わせ # - - パターンの組み合わせ - - データ検証 # - - データの検証 - - BEGIN と END # - - BEGIN と END - 1.5 計算 # - 1-5 AWK による計算 - - カウント # - - 数え上げ - - 総和と平均 # - - 和と平均の計算 - - テキスト処理 # - - 文章の操作 - - 文字列の連結 # - - 文字列の連接 - - 最終入力行の表示 # - - 最後の入力行の印字 - - 組み込み関数 # - - 組み込み関数 - - 行数、単語数、文字数のカウント # - - 行数、単語数、文字数の数え上げ - 1.6 制御フロー文 # - 1-6 制御文 - - if-else文 # - - If-Else 文 - - while文 # - - While 文 - - for文 # - - For 文 - - FizzBuzz @ - 1.7 配列 # - 1-7 配列 - 1.8 便利な一行プログラム # - 1-8 便利な「一行野郎」たち - 1.9 さて次は? # - 1-9 お次は何? 2章 Awkの実践例 - 2.1 個人用ツール - - BMI (体格指数) - - 単位変換 - - シェルスクリプトについて - - - 訳者補足 - 2.2 選択 - 2.3 変換 - - 行末文字 - - 多段組 - 2.4 データ要約 - 2.5 個人用データベース - - 株価 - 2.6 個人用ライブラリ - - 日付の形式 - 2.7 章のまとめ 3章 探索的データ分析 - 3.1 タイタニック号の乗客データ - - 集計データ: titanic.tsv - - - 訳者補足 - - 乗客データ: passengers.csv - - さらにデータ検証 - 3.2 ビールの評価データ - 3.3 データのグループ化 - 3.4 Unicode 文字 - 3.5 簡易グラフとチャート - 3.6 まとめ 4章 データ処理 # 第3章 データ処理 - 4.1 データの変形とリダクション # - 3-1 データ変換と導出 - - フィールド別の集計 # - - コラムの和 - - パーセンテージと四分位数の計算 # - - 百分率と分位の計算 - - カンマを含む数値 # - - コンマつきの数 - - 固定長フィールド # - - 固定欄入力 - - シンボルのクロスリファレンス # - - プログラムの相互参照検査 @ # - - 書式つき出力 - 4.2 データ検証 # - 3-2 データの検証 - - 開始/終了の報告 ? - - 対応のとれた区切子 - - パスワードファイル検査 # - - パスワード・ファイルの検査 - - データ検証プログラムの生成 # - - データ検証プログラムの生成 @ # - - どっちの版の AWK? - 4.3 bundle と unbundle # - 3-3 Bundle と unbundle - 4.4 マルチラインレコード # - 3-4 複行レコード - - 空行区切り # - - 空行で区切られたレコード - - マルチラインレコードの処理 # - - 複行レコードの処理 - - ヘッダ/トレイラ付きのレコード # - - ヘッダとトレイラつきのレコード - - 名前 - 値 のペアデータ # - - 名前と値からなるデータ - 4.5 章のまとめ # - 3-5 まとめ 5章 レポートとデータベース # 第4章 レポートとデータベース - 5.1 レポートの作成 # - 4-1 レポートの生成 - - 単純レポート # - - 単純なレポート @ # - - もう少し複雑なレポート - 5.2 クエリのパッケージ化とレポート # - 4-2 パッケージ化された質問とレポート - - 定型文書 # - - 定型書簡 - 5.3 リレーショナルデータベース # - 4-3 関係データベース・システム - - 自然結合 # - - 自然和 - - relfile # - - relfile - - q: Awkライクなクエリ言語 # - - Awk もどきの問い合わせ言語 q - - qawk: q-Awk トランスレータ # - - q から awk への翻訳プログラム qawk - 5.4 章のまとめ # - 4-4 まとめ 6章 テキスト処理 # 第5章 語句処理 - 6.1 ランダムなテキスト生成 # - 5-1 文書の無作為生成 - - ランダムな選択 # - - 無作為選択 - - ランダムなことわざ生成 # - - 決まり文句の生成 - - ランダムな文章 # - - 乱れ文 - 6.2 インタラクティブなテキスト操作 # - 5-2 対話的文書操作 - - 計算問題プログラム # - - 能力テスト: 算数 - - クイズプログラム # - - 能力テスト: クイズ - 6.3 テキスト処理 # - 5-3 文書処理 - - 単語カウント # - - 単語の数え上げ - - テキストの整形 # - - 文書整形 - - 原稿のクロスリファレンス管理 # - - 相互参照の一貫性保持 - - KWICインデックスの生成 # - - KWIC索引の生成 - 6.4 索引の生成 # - - 索引の生成 - 6.5 章のまとめ # - 5-4 まとめ 7章 専用言語 # 第6章 小さな言語 - 7.1 アセンブラとインタプリタ # - 6-1 アセンブラとインタープリタ - 7.2 グラフ作成言語 # - 6-2 グラフ作製言語 - 7.3 ソートオプションジェネレータ # - 6-3 整列生成プログラム - 7.4 逆ポーランド記法電卓 # - 6-4 逆ポーランド電卓 - 7.5 別アプローチ # - 6-5 普通の電卓 - 7.6 算術式用の再帰下降型パーサ # - 6-6 再帰下降型構文解析法 - 7.7 サブセット Awk 用の再帰下降型パーサ @ - 7.8 章のまとめ # - 6-7 まとめ 8章 アルゴリズムの実験 # 第7章 アルゴリズムの実験 - 8.1 ソート # - 7-1 整列 - - 挿入ソート # - - 挿入法 - - - 基本動作 # - - - 基本的なアイデア - - - 実装 # - - - 実現方法 - - - 動作確認 # - - - テスト方法 - - - 性能 # - - - 効率評価 - - クイックソート # - - 分割法 - - - 基本動作 # - - - 基本的なアイデア - - - 実装 # - - - 実現方法 - - - 性能 # - - - 効率評価 - - ヒープソート # - - 整列2分木法 - - - 基本動作 # - - - 基本的なアイデア - - - 実装 # - - - 実現方法 - - - 性能 # - - - 効率評価 - 8.2 プロファイリング # - 7-2 輪郭分析 - 8.3 トポロジカルソート # - 7-3 位相整列 - - 幅優先トポロジカルソート # - - 広さ優先の位相整列 - - 深さ優先探索 # - - 深さ優先の探索 - - 深さ優先トポロジカルソート # - - 深さ優先の位相整列 - 8.4 make: ファイル更新プログラム # - 7-4 Make: ファイル更新プログラム - 8.5 章のまとめ # - 7-5 まとめ 9章 あとがき # 第8章 エピローグ - 9.1 プログラム言語としての Awk # - 8-1 言語としてのAWK - 9.2 性能 # - 8-2 効率 - 9.3 最後に # - 8-3 結論 @ # - - 文献ノート @ # 付録 A AWKのまとめ @ # - - コマンド行 @ # - - AWK プログラム @ # - - パターン @ # - - アクション @ # - - プログラム書式 @ # - - 入出力 @ # - - Printf 書式変換 @ # - - 組み込み変数 @ # - - 組み込み文字列関数 @ # - - 組み込み算術関数 @ # - - 式演算子 (優先度の低い順) @ # - - 正規表現 @ # - - エスケープ・シーケンス @ # - - 制限 @ # - - 初期化、比較、および型変換 付録 A Awk リファレンスマニュアル # 第2章 AWK言語 - - Awkプログラム @ - - コマンドライン @ - - 入力ファイル countries # 入力ファイル countries @ # プログラムの書式 - A.1 パターン # - 2-1 パターン - - A.1.1 BEGIN と END # - - BEGIN と END - - A.1.2 式パターン # - - パターンとしての式 @ # - - 文字列照合パターン - - A.1.3 正規表現パターン # - - 正規表現 - - A.1.4 正規表現詳細 - - - メタ文字 - - - 文字クラス - - - - 訳者補足 - - - 否定の文字クラス - - - グループ化 - - - 繰り返し - - - 正規表現と文字列内のエスケープシーケンス - - - 正規表現の例 @ # - - 複合パターン - - A.1.5 範囲パターン # - - 範囲を示すパターン @(あり) # - - パターンのまとめ - A.2 アクション # - 2-2 アクション - - A.2.1 式 # - - 式 - - - 定数 - - - 変数 - - - 組み込み変数 - - - フィールド変数 - - - 代入演算子 - - - 条件演算子 - - - 論理演算子 - - - 関係演算子 - - - 算術演算子 - - - 単項演算子 - - - インクリメント/デクリメント演算子 - - - 数値演算組み込み関数 - - - 文字列演算子 - - - 正規表現としての文字列 - - - 文字列演算組み込み関数 - - A.2.2 型変換 - - - 代入 - - - 数値か文字列か - - - 比較と型強制 - - - 型推論 - - - 数値から文字列への型変換 - - - 演算子のまとめ - - A.2.3 制御フロー文 # - - 制御文 - - A.2.4 空文 # - - 空文 - - A.2.5 配列 # - - 配列 - - - delete 文 - - - split 関数 - - - 多次元配列 - A.3 ユーザ定義関数 # - 2-3 ユーザ定義関数 - A.4 出力 # - 2-4 出力 - - A.4.1 print文 # - - print文 - - A.4.2 出力区切り文字 # - - 出力区切子 - - A.4.3 printf # - - printf 文 - - A.4.4 ファイル出力 # - - ファイルへの出力 - - A.4.5 パイプ出力 # - - パイプへの出力 - - A.4.6 ファイルとパイプのクローズ # - - ファイルとパイプの閉鎖 - A.5 入力 # - 2-5 入力 - - A.5.1 入力区切り文字 # - - 入力区切子 - - A.5.2 CSV入力 @ - - - 訳者補足 - - A.5.3 マルチラインレコード # - - 複行レコード - - A.5.4 getline 関数 # - - getline 関数 - - A.5.5 コマンドライン引数と変数 # - - コマンド行での変数への代入 @ - - コマンド行引数 - A.6 他プログラムとの連携 # - 2-6 他のプログラム言語との組み合わせ - - A.6.1 system 関数 # - - system 関数 - - A.6.2 Awk プログラムを実行コマンドに # - - AWKプログラムをシェル・コマンドに - A.7 リファレンスマニュアルの最後に # 2-7 まとめ @ # 付録 B 演習問題解答 @ # 付録 C AWK処理系の入手法 @ # - C-1 市販ソフトウェア @ # - C-2 フリー・ソフトウェア 索引 # 索引
==========