0

我想编写一个单行命令来使用相同的标准输入副本执行两项任务。这是示例:

% 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

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

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