行単位のデータを、ある条件で複数のファイルに振り分ける処理をするときbashのreadが思い浮びますが行単位のデータにスペースが含まれると処理によっては都合が悪いことが多いです。
そこで、awkの”>”や”>>”を使うと、さまざまな条件で行を複数のファイルに分割することができます。
例えば、Aという文字が含まれる行をa.txt、Bという文字が含まれる行をb.txtに入れる場合は、”>”を使います。
$ cat test.data A 1111 B 1111 C 1111 A 2222 B 2222 C 2222 $ cat test.data | awk '/A/ {print > "a.txt"} /B/ { print > "b.txt"}' $ cat a.txt A 1111 A 2222 $ cat b.txt B 1111 B 2222 $
さらに、データを累積していくには、”>>”を使います。
$ cat test.data | awk '/A/ {print >> "a.txt"} /B/ { print >> "b.txt"}' $ cat a.txt A 1111 A 2222 A 1111 A 2222 $ cat b.txt B 1111 B 2222 B 1111 B 2222 $
パターンマッチは、awkの正規表現が使えるし、print文の書き方でデータの加工も可能です。
awkは、すばらしい!