ksaitoの日記

日々試したことの覚え書き

awkで複数ファイルにデータを出力する

移転しました。

自動的にリダイレクトします。

行単位のデータを、ある条件で複数のファイルに振り分ける処理をするとき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は、すばらしい!