たまに、awkでパースした要素を使ってOSのコマンドを実行させたりすることがある。 で、さらにOSのコマンドだけではなく、さらにawkの処理を組み合わせてやりたいことがある。そういう時、ただ単にOSのコマンドを実行後に処理を記述すると、実行されるタイミングの違いによって意図した結果が得られない場合がある。

blacknon@BS-PUB-UBUNTU-01:~$ # 先にrevを実行しているが、処理速度の違いから後から実行しているprintが先に出力されている
blacknon@BS-PUB-UBUNTU-01:~$ echo TEST123 | awk '{print $0|"rev";print $0}'
TEST123
321TSET

こういった場合は、実行したOSのコマンドをclose("cmd")で記述してやることで、処理の終了待ちができる。

echo TEST123 | awk '{print $0|"rev";close("rev");print $0}'
blacknon@BS-PUB-UBUNTU-01:~$ echo TEST123 | awk '{print $0|"rev";close("rev");print $0}'
321TSET
TEST123