シェルcmdによるawkパイプの入出力

シェルcmdによるawkパイプの入出力

awkでシェルコマンドを実行したいです。シェルコマンドは通常、stdinを使用してstdoutに書き込みます。

print to_sort | "sort"
"sort" | getline

動作しません(入力を待っている2行目でソート)

print to_sort | "sort" | getline

文法エラーです。

答え1

GNUは知っています。共同プロセスこれは可能です。このマニュアルでは、実行中の操作が機能しない理由も説明しています。パイプラインで使用される2つのコマンドは、同じコマンドラインを使用して開始されたにもかかわらず、異なるサブプロセスです。同じサブプロセスから入力と出力を取得するには、|&両方のパイプで使用します。

awk 'BEGIN {com = "cat -n"} {print |& com; com |& getline; print}'

しかし、これは生産をしていないsortので実際には役に立ちません。sortどの入力にEOFが表示されるまで出力します。

このようなコマンドの場合は、まずすべての出力を提供し、coprocessパイプの書き込み端を閉じてから読み取りを開始する必要があります。例えば

awk 'BEGIN {com="sort"} {print |& com} END { print "---"; close(com, "to"); while(com |& getline) print }'

関連情報