キャリッジリターンによるパイプ値の継続印刷

キャリッジリターンによるパイプ値の継続印刷

sedコマンドを使用していくつかのフィルタリングを実行し、結果をパイプしてgzip出力を再圧縮するbashスクリプトがあります。フィルタリングされた出力の形式は<id>,<title>,<bool (0 or 1)>idを印刷したいのですが、idが増加するにつれて両方を互いに印刷するために改行の代わりに末尾のキャリッジリターンを使用します。私のアプローチは次のとおりです。

<chained sed commands> \
| tee >(sed -re "s/^([0-9]+).*/\1\r/") | gzip -c > outputfile.gz

ただし、これにより各行に改行が追加され、1行にのみ印刷したときに期待される結果が得られなくなります。

ベストアンサー1

gzipで圧縮されたデータに表示されないように、進行状況インジケータをstderrに出力する必要があります。私はこれを使用しますperl

<chained sed commands> | perl -pe 'print STDERR "$1\r" if /^(\d+)/' | gzip -c > outputfile.gz

perl -p各入力ライン(修正可能)を印刷する自動ループを作成することを意味します。-eループ内で実行する式を定義します。

この式は行の先頭の数字と一致し、見つかった場合は末尾のキャリッジリターンと一緒にstderrに印刷します。入力は圧縮される出力に渡されます。

視覚的にもっと見る良い変形は、printステートメントの値をに置き換えることです"\r$1 "\。これによりカーソルが最後に残り、現在のIDが前のIDより小さい場合、余分なスペースは前の行のすべての数字を上書きします。

おすすめ記事