teeによって定義されていませんが、Daenythが言うように、teがデータの受け渡しを完了するまでwcは終了しません。したがって、通常、teeはそれまでにawkにデータを渡します。この場合、awkにカウントを行わせる方がよい場合があります。
echo -ne {one,two,three,four}\\n | \
awk '{print "awk processing line " NR ": "$0} END {print "Awk saw " NR " lines"}'
欠点は、終了するまで番号がわからないことです(データをバッファリングする必要があることを知っています)。あなたの例では、teeとwcの両方が同じパイプ(awkの場合はstdin)に接続されたstdoutを持っていますが、順序は定義されていません。cat(および他のほとんどのパイプツール)を使用して、既知の順序でファイルを組み立てることができます。
bashコプロセス(coproc)や名前付きパイプ(mkfifoまたはmknod p)など、使用できるより高度な配管技術があります。後者はファイルシステム内の名前を取得し、他のプロセスに渡すことができますが、それらをクリーンアップして衝突を回避する必要があります。tempfileまたは$$がそのために役立つ場合があります。パイプはサイズが制限されていることが多く、書き込みをブロックするだけなので、データをバッファリングするためのものではありません。
パイプが間違った解決策である例:
mkfifo wcin wcout
wc -l < wcin > wcout &
yes | dd count=1 bs=8M | tee wcin | cat -n wcout - | head
ここでの問題は、最初にwcoutで終了したい猫に物事を書き込もうとしてTシャツがスタックすることです。ティーからキャットへのパイプのデータが多すぎます。
dmckeeの回答に関する編集:はい、順序は繰り返し可能である可能性がありますが、保証されていません。これは、スケール、スケジューリング、およびバッファーサイズの問題です。このGNU/Linuxボックスでは、例は数千行後に分割され始めます。
seq -f line%g 20000 | tee >(awk '{print "*" $0 "*"}' ) | \
(awk '{print "this is awk: "$0}') | less
this is awk: line2397
this is awk: line2398
this is awk: line2*line1*
this is awk: *line2*
this is awk: *line3*