在运行其余管道的同时捕获中间管道结果的导数

时间:2018-09-24 13:13:20

标签: bash pipe

我有一堆*.bz2文件,其中包含一些压缩的文本数据。我将它们解压缩到单个文件intermediary.txt中,以计算子字符串myString的出现次数:

find . -name '*bz2' -exec bzip2 -k -c -d {} > intermediary.txt

然后(计算myString的出现次数)

echo "Number of occurrences:"
grep -o "myString" intermediary.txt | wc -w

然后通过一些流操作继续处理:

cat intermediate.txt | sed ... | sed ... | someCommand > out.txt

我现在想在一个管道中处理所有步骤,即在out.txt中得到结果,并且在标准输出上仍然有myString出现的次数而不必写intermediary.txt。因此管道应如下所示:

find . -name '*bz2' -exec bzip2 -k -c -d {} | <some magic here> | sed ... | sed ... | someCommand > out.txt

(怎么)可能?

更新 我在下面尝试了@Charles Duffy的版本,但是对bzip2进行了部分修改,改为使用bzcat。我认为它不太冗长,并且不应该影响性能(虽然不确定)。

这可以完成工作。但是,现在很高兴在Pipeline Viewer中包含此管道,以获取有关进度的反馈(有很多*.bz2文件!)。用pv -cN source < ...前缀整个内容是行不通的。我为此here

发布了一个单独的问题

2 个答案:

答案 0 :(得分:1)

减少复杂性,以将捕获的内容保留为管道末端的标准输出,并使用进程替代其他输出:

result=$(find . -name '*bz2' -exec bzip2 -k -c -d {} + \
          | tee >(sed ... | sed ... | someCommand >out.txt) \
          | grep -e myString \
          | wc -l)

请注意,-exec ... {} +的使用比以前使用的find操作(为每个输出文件运行bzip2的单独副本)的效率明显更高。

答案 1 :(得分:0)

您可以使用重定向和tee

#! /bin/bash
exec 3>&1
echo $'a\nd\nc\nb' | tee >(wc -w >&3) | sort > output

echo的输出分为两个流,一个由wc处理,然后转到&3,这在输出中显示。另一个由sort处理,并保存到output文件中。