我想编写一个单行命令来使用相同的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
?你有什么建议吗?
答案 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"