ストリームをコピーし、ストリーミング方式で両方の部分を処理する方法は?

ストリームをコピーし、ストリーミング方式で両方の部分を処理する方法は?

時には報告や他の補助的な使用のためにパイプラインに何かを挿入したいと思うかもしれません。それはそう簡単かもwc -lしれませんし、awkPythonスクリプトのようにもっと複雑かもしれません。次のようにパイプラインを実行することをお勧めします。

zcat my_data_file.gz \
| wc -l > /tmp/linecount
| process_data.py

問題は、ほとんどのユーティリティがデータを標準出力に正しく出力しないことです。teeデータは一時ファイルに書き込むことができますが、すべてが完了するまで待つ必要があります。

zcat my_data_file.gz \
| tee /tmp/f \
| process_data.py && \
wc -l /tmp/f > /tmp/linecount && rm /tmp/f

これは最適ではありません。非常に長い間実行されているパイプラインである可能性があり、wcアナログの中間結果をより速く見たいと思うかもしれません。すべてのデータを一時ファイルに保存したくない場合があります。

ベストアンサー1

代替項目を使用teeして処理できます>(...)

zcat my_data_file.gz |

# Count number of lines in stream
tee >(wc -l > /tmp/linecount) |

# Further processing
process_data.py

パイプラインは行の連続に使用でき、コメントはコマンド間に挿入できます。これは複雑なパイプラインを構築するのに良い機能です。

おすすめ記事