awkのコプロセスと双方向パイプ

awkのコプロセスと双方向パイプ

command | getline varの違いを理解しようとしていますcommand |& getline var。通常どれを使うべきですか?コプロセスと双方向パイプについて読みましたが、状況が本当に混乱しているので説明が必要です。

実は私が使っているのは

kmd=sprintf("%s%d\n", "tput bold; tput setaf ", knum)
tseq[knam] = ( (kmd | getline outp) > 0 ? outp : "<" knam ">" )
close(kmd)

ここでの共同プロセスは何ですか? tputを使用していますか?コードには一方向パイプ通信しかないと思います。これを使用すると、どのような利点がkmd |& getline outpあり、後者を使用する必要がありますか?

ベストアンサー1

あなたの質問のコードには補助プロセスはありません。呼び出すサブシェルを作成してから、tputそのサブシェルの出力を読み取るだけですgetline

情報What would be the benefit of using kmd |& getline outp, and should I use the latter instead?- 役に立たないだけでなく、これは構文の半分にすぎないため、次のことが必要です(エラー処理を含む)。

print knum |& kcmd
kcmd |& getline outp
close(kcmd)

しかし、これはstdinを読み込み、stdoutを生成するコマンドが含まれている場合にのみ意味があります。kcmd下痢 そうしても、やりたいことに何の役にも立たず、コードが不要になります。鈍い人。

以下は、コルーチンが有用な場合の例です。パイプを介して着信数値ストリームを並べ替えてから、sort数字を印刷する前に数字で操作を実行します。

$ cat tst.awk
BEGIN {
    cmd = "sort -rn"
}
{ print |& cmd }
END {
    close(cmd, "to")
    while ( (cmd |& getline line) > 0 ) {
        print line, line / NR
    }
    close(cmd)
}

$ seq 5 | awk -f tst.awk
5 1
4 0.8
3 0.6
2 0.4
1 0.2

デフォルトでは、一時ファイルに書き込む必要があるawkスクリプトを作成する場合は、そのファイルに対して外部コマンドを呼び出してから、そのコマンドの出力をスクリプトに戻します。ここでは、コプロセッシングの使用を検討する必要があります。一時ファイルを作成する必要がないので本当です。

詳細については、Arnold RobbinsのEffective AWKプログラミング5版の本をダウンロードして、他のプロセスとの双方向通信セクションを読んでください。

おすすめ記事