复制标准输入,运行两个任务,同时保留输出行的顺序?

时间:2012-12-20 12:38:58

标签: shell tee

我想编写一个单行命令来使用相同的stdin副本执行两个任务。这是一个例子:

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

结果最终将保存到一个文件中,由我的程序处理。而我期望获得的是:

2
Victor

但是,如果wc恰好较慢,有时输出顺序可能会反转:

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

也许我不应该像这样使用tee?你有什么建议吗?

2 个答案:

答案 0 :(得分: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];}'

不漂亮。输入数据集越大,内存越大。但它会提供你期望的输出。

答案 1 :(得分:1)

对于这个例子,我认为最清晰的方法是经典的preocedural风格:

names="Victor\nHugo\n"
printf $names | wc -l
printf $names | grep "V"