如何用tee实现命令输出分流至两命令并合并结果?
解决管道分流后合并输出的问题
你的核心需求是避免重复读取源文件,用tee分流到两个处理命令,再用paste合并结果对吧?之前的tee用法不对,因为paste需要明确接收两个处理后的数据流,而不是原文件内容。
先给你直接能用的命令:
paste <(cat myfile.txt | tee >(cut -f2 | xargs wc -l | awk '{print $1}' >&3) | cut -f1) <&3
为啥这个能行?
tee把myfile.txt的内容同时送到两个分支:- 一个分支直接走
cut -f1,输出第一列的键值 - 另一个分支处理第二列:
cut -f2提取文件路径,xargs wc -l统计文件行数,awk '{print $1}'只保留数字(去掉wc输出里的文件名),结果写入文件描述符3
- 一个分支直接走
paste的第一个输入是键值分支的结果,第二个输入是文件描述符3的行数结果,刚好对应合并成你要的格式
如果觉得文件描述符有点绕,也可以用临时文件过渡(适合更复杂的场景):
# 用tee分流到两个临时文件 cat myfile.txt | tee >(cut -f1 > temp_keys) >(cut -f2 | xargs wc -l | awk '{print $1}' > temp_counts) > /dev/null # 合并结果 paste temp_keys temp_counts # 清理临时文件 rm temp_keys temp_counts
原来的命令问题在哪?
你之前的命令里,tee会把原文件内容同时输出到两个进程替换和stdout,然后paste只接收到了stdout的原内容,根本没拿到两个处理后的结果,所以输出不符合预期。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

