コマンドプロンプトで cat する

コマンドプロンプトでcatする。というのは awk でも Perl 同様に非常に簡単に記述できます。

$ gawk '1' file1 file2 file3 > output.txt

これ自体にたどり着くまでのものが 10 Awk Tips, Tricks and Pitfalls に記述されていますので、少し書き加えて置きます。

awk は本来以下のように記述されます。

$ gawk 'Condition { Actions }'

つまり、ある条件 (Condition) にマッチする場合に何かを実行 (Action) するわけです。 そういう意味で、元々以下のような記述になります。

$ gawk '$0 ~ /*/ {print $0}' file1 file2 file3 > output.txt

つまり、「$0 (1 行) が 0 文字以上の場合に、その行を表示しなさい」ということです。

ところが awk は $0 ~ /Pattern/ の場合には $0 ~ を省略できます。 しかも全てにマッチする場合には /Pattern/ すらも省略することができます。

$ gawk '{print $0}' file1 file2 file3 > output.txt

一般的に {print $0} は省略できるのですが、これは条件 (Condition) の記述がある場合に成立します。 つまり、以下のようには書けません。(プログラムとしては実は正しい)

$ gawk '' file1 file2 file3 > output.txt

そこで、どうするかと言えば、条件が常に真になるような条件を選べば良いことになります。 awk で条件が真とは 0 より大きな数字または空ではない文字列を返すことを指しますので、0 よりも大きな数が返ったとすればいいわけです。(一般的には 1 とか、l や I と見間違えないように 9 とかも使います)

つまり、

$ gawk '1' file1 file2 file3 > output.txt

となるわけです。

私事ですが、初心者に cat を教えた時に「cat って何で必要なの?」と聞かれたことがあります。 事実、cat のオプションなしで使われることはほとんどないでしょう。 私が最初に使った cat は FreeBSD 1.5 のインストールでフロッピーを何枚もコピーして最後に cat で繋げて tar ファイルを作成するようなものだったと記憶していますが、そういうテキスト以外も含めて cat は繋げるためのものだと認識しています。 なので、バイナリも扱おうとすると上の一行野郎は破綻しますから、実際には cat でも何でもありません。

しかし、awk の魅力を知ったのも cat でした。 たった 1 バイトで cat ができるわけですから、これは凄いと思って勉強したのが十数年前になります。 何年たっても同じ構文が通用する LL も珍しくなっている中で本当に awk は素晴らしい言語だとおもいます。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png