0

stdinの同じコピーで2つのタスクを実行する1行のコマンドを記述したいと思います。次に例を示します。

% echo "Victor\nHugo" | tee >(wc -l) | grep "V"

結果は最終的にファイルに保存され、私のプログラムで処理されます。そして、私が期待するのは次のとおりです。

2
Victor

ただし、場合によっては、出力の順序が逆にwcなることがあります。

% echo "Victor\nHugo" | tee >(sleep 1s; wc -l) | grep "V"
Victor
2

多分私はteeこのように使うべきではありませんか?何か提案はありますか?

4

2 に答える 2

2

awk を使用すると、単一のパイプを使用できます。

printf "Victor\nHugo\n" \
| awk '{a[NR]=$0} END {print NR; for(i=1;i<=NR;i++) if (a[i]~/^V/) print a[i];}'

それはきれいではありません。また、入力データセットが大きくなるほど、メモリを大量に消費します。しかし、それはあなたが期待する出力を提供します。

于 2012-12-20T12:45:29.483 に答える
1

この例では、最も明確なアプローチは古典的な前処理スタイルだと思います:

names="Victor\nHugo\n"
printf $names | wc -l
printf $names | grep "V"
于 2012-12-20T12:46:44.157 に答える