Awk使い正道邪道

わたしがAwkで扱う「物理的」標準データ形式: 表を表現する空白区切りのテキストファイル

Awkを使うとき、 論理的な「表」は、ふつう、 行からなるテキストファイルで表現され、 テキストファイルのそれぞれの行(line)が、表の行(row)に対応する。 Unixやそれにならったオペレーティングシステムでは、 行は、「改行」(linefeed あるいは newline) の制御文字 (ASCII 16進 0a) でくぎられている。

Awkでは、 論理的な表に対応する、それぞれの行のうちのフィールドは、 組みこみ変数「FS」で指定された「フィールド区切り文字 (field separator)」 でくぎられる。 もし「FS」が指定されていなければ、 空白 (ASCII 16進 20) と タブ (ASCII 16進 09)の両方がフィールド区切り文字として働く。

フィールド区切り文字としてつかわれたとき、 空白は、ほかの文字とちょっとちがった働きかたをする。 連続した空白は、ひとつの空白と同じ意味になるのだ。 わたしはこの特徴が便利だと思う。 セルの内容の長さがまちまちであっても、 適切な数の連続した空白をはさむことによって、 フィールドの位置 [行の端からかぞえた文字数] を一定にすることができる。 わたしは、表の内容を目で確かめたくなることがたびたびある。 とくに、はずれ値を見つけて、いつどこでどんなはずれ値が生じたか認識するために、 見ることがある。 この作業をするとき、同じ列に対応するフィールドは、どの列でも、同じ文字数をもっていてほしい。 (実際は、フィールドの内容と、 それにつづくフィールド区切り文字をあわせた文字数が同じであってほしい。) そうなっていれば、 端末(コンソール)の画面に 文字幅が一定のフォントで表示させれば、 列は縦にまっすぐそろって見える。

このやりかたの欠点として、 まず、行の右端にくるセル以外では、セルの内容を 空文字列 [文字数ゼロの文字列] にすることができない。 また、[どこのセルでも] セルの内容に空白文字をふくめることができない。

わたしは、データをこの形式にするとき、つぎのような修正をする。 文字列中に空白文字がふくまれているときは、 それを下線文字 ("_")でおきかえる。 セルの内容が空のときは、 文字列として読まれる予定のばあいは、下線文字からなる文字列でおきかえる。 数値として読まれる予定のばあいは、その特定の応用の文脈でデータ欠損をあらわす きまった数字列でおきかえる。 (これは、たしかに、普遍的ではない。しかし、Awk や Fortran に常備された機能を使って データを読むための準備として、こうしている。)

このデータ形式は、固定長形式でもあり、空白区切り形式でもある。 わたしは、Awk のほかに Fortran を使うので、この形式がとりわけ便利なのだ。 Fortranの「書式つき」のREAD文 (例 READ(*,'(3F10.0)') var1, var2, var3). では、データが固定長であると想定している。 Fortranの「並びに従う (list-directed)」 READ文 (例 READ(*,*) var1, var2, var3), では、データが空白区切りであると想定している。 わたしは、データをどちらの方法でも読めるようにしたい。 Fotranの「並びに従う入力」で、文字列をどのように読むかは、 個別のコンパイラごとにちがうようだが、 わたしが経験したところでは、 データのうちで、読まれるべき文字列を、引用符でくくっておく必要がある ("string" または 'string' のように)。 わたしが実際にデータの文字列を読む必要があるときは、固定長入力を使うことにしている。 データに文字列があっても、それを読むプログラムで使わないならば、 表を構成するとき、数値をふくむ列(複数)を左側にまとめておき、 プログラムではその部分だけを「並びに従う入力」で読むことにしている。

なぜタブくぎりにしないのか?

わたしは、タブ文字は有用であることをみとめるが、 それは、フィールド区切り文字が必ずタブであり、 タブがそれ以外の場所にあらわれないことが、絶対確実であるばあいにかぎる。 わたしが自分でデータをあつかうとき、わたしはそれほど注意深くない。 ふつうの端末(コンソール)の設定では、 タブ文字は、いくつかの空白として表示され、 何個の空白になるかは、それぞれの状況に依存する。 データにふくまれているのがタブなのか、連続した空白なのか、 人が見わけるのは たやすくない。 また、標準のタブ間隔は 8 文字とされることが多いが、 わたしがあつかう表のセルの内容は、それより短いこともあれば長いこともある。 タブ区切りのファイルを端末の画面に表示させると、縦の列がそろわないのだ。 それにくわえて、Fortran でタブ文字をどうあつかうかは、 それぞれのコンパイラに依存する。 以上のような理由で、わたしはタブ文字を使うのをさけている。


[英語版] 2004-02-21, 2005-02-05, 2015-06-13
日本語版 2021-02-13
増田 耕一 (MASUDA Kooiti) MASUDA Kooiti
[「Awk使い正道邪道」の目次へ]