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 でタブ文字をどうあつかうかは、 それぞれのコンパイラに依存する。 以上のような理由で、わたしはタブ文字を使うのをさけている。