第1章 awk:はじめに伝えるべきこと

1-1 awkを使うメリット

最小の工数で最大の結果を生むことができるという点につきます。ただし、対象はテキストファイルに限定されます。

覚えることも最小限で、それでもかなりのことができる点が最大のメリットになります。

標準入力からテキストファイルを改行単位で読み込み、所定のパターンを見つけて処理をし「標準出力」へ出力していきます。

行単位で処理をしていくので、対象とするテキストファイルが1000万行あったとしてもメモリリーク(memory leak)を起こす懸念がありません。これもメリットとしてあげることができます。

awkはインタープリタ1)(interpreter)ですので、コンパイラ2)(compiler)に比べて処理速度が遅いという指摘もあります。

1)「インタープリタ」とは処理系がスクリプトを読み込みながら逐次的に処理をしていく方式になります。
JavaScript、Ruby、PHP、Python、その他にもたくさんあります。
2)「コンパイラ」は処理系が一括してCPUが理解する機械語に変換してから処理が実行される方式になります。
c、c++、Java、Go、Rust、その他にもたくさんあります。伝統的にはFortranやCobolなど。

インタープリタとコンパイラの中間的な言語もありますが、ここでは触れません。

    しかし、対象のテキストファイルが「標準入力」というI/O(input/output)を経由して取得するので、そこで大幅な速度の損失があるわけです。よって、インタープリタであることは、トータル(スクリプトを作成する時間など)で考えると、さほどのデメリットにはならないと考えています。

    awkを使うためには「コマンドプロンプト」と「テキストエディタ」を使うことになりますが、これについては順次、説明していきます。

    1-2 対象としている人

    主としては『Excelを使ってデータ処理を日常的に行っており、ちょっとしたことをさっとこなして本来的な分析などの業務をこなすのにVBAで処理を作成するまでもないと感じているような人』をメインの対象者として書いています。

    「テキストエディタ」の操作に関しては問題は全くないと思いますが、「CUI」の操作には慣れがないと思うので戸惑うこともあるかと思いますが、awkの強力さを手にすることができれば、新たに覚えることの面倒さは全く問題にならないでしょう。前提はマイクロソフトの「Windows」ユーザーが対象です。

    1-3 awkの概要を簡単に説明すると

    unixの開発においてawkも開発されました。awkの名前は開発者3人の頭文字から作られています。ms-dosが誕生する前のことです。およそ今から半世紀ほど前のことになりますが、awkは現在でも進化を続けています。

    Mackintoshが誕生し、windowsが誕生することでグラフィカルなインターフェースが今では主流になっていますが、unixもms-dosもコマンドラインから命令を与える形式のキャラクタベース(コマンド入力スタイル)のインターフェースでした。

    awkもコマンドラインから使いますので、Windowsでのコマンドラインの操作を覚える必要がありますが、GUIと連携できる部分もありますので、それほど面倒なことではありません。

    awkの主たる特徴は、

    ・C言語ライクな構文(記法)によるインタープリタ言語であること
    ・正規表現が使える強力なマッチング機能を装備していること
    ・連想配列が使えること(配列の添え字に文字列を使うこと)
    ・テキストファイルだけを対象としていること

    などを上げることができます。

    1-4 ストリームエディタの考え方

    ストリームエディタというと、狭義には「sed」というツールを意味します。「stream editor」に由来しています。1974年に登場したとされています。

    sed」は、入力ストリーム(コンピュータが逐次的に読んだり書いたりするデータのことをデータストリームと呼ぶ。データストリームはバイト<8bitのデータ>が並んだもの)に対してテキストデータに限定して指示を与え、データストリームに対してパターンがマッチする部分の編集をするプログラムのことです。

    おそらくうまく伝わらないと思いますが、データファイルを最初から最後まで読み込ませることを「ストリーム(stream):流れ」と言っています。「sed」の最大の特徴は「正規表現」に対応していたことです。「正規表現」については、いずれ説明しますが、awkで日常的に使う「正規表現」に限定した説明となります。本格的に知りたい方は、ネットにたくさんの記事が上がっていますので、そちらを参考にしてください。

    sedの特徴は、テキストデータを標準入力からストリームとして読み込みながら編集をしていく点が、対話的に編集する通常のエディタと異なっている点です。

    awkは、sedに対して、プログラミング要素を加えていることで、さらに強力な使い道を提供しています。

    1-5 CUIとGUI

    CUIは「Character User Interface」の略で、GUIは「Graphical User Interface」の略になります。Windowsを普通に使う分には、CUIの出番は全くというほどありません。

    CUIはコンソール画面から文字を打ち込んでコンピュータを操作するインターフェースのことになります。このコンソール画面を「コマンドプロンプト」と呼んでいます。昔のMS-DOSの時代の画面のことになります。

    こんな画面が「コマンドプロンプト」

    GUIは、マウスを使ってアイコンなどを操作するグラフィカルな画面のインターフェースをいいます。awkはCUIで使うことになりますので、最低限の操作を覚える必要がありますが、awkを操作する上で必要なことしか触れませんので、詳しく知りたい人は他を参照してください。

    1-6 標準入力と標準出力とリダイレクト

    厳密な話としては実行時にプログラムに割り当てられている入力用データストリームのことを「標準入力」とよび、出力用データストリームのことを「標準出力」と呼ぶとのことです。awkの場合の標準入力はキーボードから読み取られ、標準出力は「コンソール画面」に出力されることになっています。

    ここでいうコンソール画面とは「コマンドプロンプトの画面のことになります。

    コンソール(Console」とはコンピューターを操作するための一連の入出力装置のことで、主としては「キーボード」と「画面」のことをいいます。ようは、コンピュータに対して操作をし、その結果を得る装置のことになります。

    awkでは標準入力であるキーボードから入力する代替として、通常は、ファイルからデータストリーム読み込み、標準出力であるコンソール画面へ出力します。

    と言っても画面に表示だけしても使い道がないので、テキストファイルに出力させます。これを「リダイレクト(redirect)」といいます。「>」大なり記号を使うことで実現します。大なり記号をリダイレクト演算子とも呼ぶようです。ちなみに、「リダイレクト」とは「向きを変える」という意味です。

    実際の使い方は後程、実際に使用する場面で触れます。

    1-7 正規表現とは何か

    「有限オートマトンで表現可能な正規イベント(regular events)を表現するための式(expression)」ということが「正規表現(regular expression)」と呼ばれているもののベースとなったとのことでです。1956年のことで、これが名前の由来となっています。

    regular expression」を単純に日本語に翻訳して「正規表現」としているだけで、何をもって正規な表現なのかの意味を詮索しても仕方がありません。

    1969年に前出のトンプソンやリッチーやカーニハンらがUNIXを開発した時に、テキストエディタに組み込みawkをはじめUNIX上の様々なツールに組み込まれるようになり、現在に至っています。

    ストリームエディタのところで触れてありますが、バッチ的に自動処理をするためのsedに「正規表現」が組み込まれていることから、プログラム要素を組み込んだawkなどに発展していったようです。

    では、その「正規表現」とは何かというと、簡単にいうと「文字を抽象化して一致する部分を取り出して所定の加工をするための処理」になります。抽象化するための約束に使う「記号」を「メタ文字」といいます。

    形而上学」を英語で「metaphysics」というがごとくで、「そのものを超越している」というような意味で「メタ」という言葉を使います。

    つまり「メタ文字」とはいくつかの記号で代用させます。個々の記号は約束に応じた実態であるけれど、正規表現において使われる場面では実態を遊離した「約束」として使われるわけです。

    分かったような分からないような説明になってしまいますが、実際の使い方は後程触れます。使うほどに「正規表現」の便利さが分かると同時に、こうした発想を持って作ってしまう人たちのすごさが伝わってくると思います。

    1-8 レコードとフィールドを説明すると

    レコード」とはExcelで言うところの1行(横方向)のデータのことで、「カラム」とはExcelで言うところの列(縦方向)のことになります。

    個々のセルを「フィールド」と言います。

    awkは、Excelのようなフィールドで区切られてデータだけではなく、ワードで作成したような文書データでもテキストデータであるならば加工することは可能ですが、それにつきましては後半嚢胞で説明します。前半はフィールドで区切られた行データを中心に解説していくことになります。

    後半では、Wordで作られた文章をMarkdown形式のテキストファイルにしてから、HTMLへ加工するような使い方も後程触れます。

    1-9 対象とする文字コード

    Windows用に作られているawkでは、UTF-8のテキストファイルに対しては正常に機能しないことがあります。その実例や、回避策についても第3章以降で触れます。

    特段、断りがない場合は、文字コードはShift-JISを対象にしています。UTF-8を使う場合は1工程増やしますが、UTF-8を使う時点でその説明をします。

    エクセルやワードのデータを扱っている限りは気にする必要はありませんが、webシステムからCSVを落とす場合などはUTF-8になるので、一応は触れておく必要があるでしょう。