Bash 在运行管道的其余部分时,捕获中间管道结果的导数

Bash 在运行管道的其余部分时,捕获中间管道结果的导数,bash,pipe,Bash,Pipe,我有一堆*.bz2文件,其中包含一些压缩文本数据。我将它们解压缩到一个文件intermediate.txt,以计算子字符串myString的出现次数: find . -name '*bz2' -exec bzip2 -k -c -d {} > intermediary.txt 然后(计算myString的出现次数) 然后通过一些流操作继续处理: cat intermediate.txt | sed ... | sed ... | someCommand > out.txt 现在我

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

find . -name '*bz2' -exec bzip2 -k -c -d {} > intermediary.txt
然后(计算
myString
的出现次数)

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

cat intermediate.txt | sed ... | sed ... | someCommand > out.txt
现在我想在一个管道中处理所有步骤,即在
out.txt
中得到结果,并且在stdout上仍然有
myString
的出现次数,而无需编写
intermediate.txt
。所以管道应该是这样的:

find . -name '*bz2' -exec bzip2 -k -c -d {} | <some magic here> | sed ... | sed ... | someCommand > out.txt
find-名称'*bz2'-exec bzip2-k-c-d{}| | sed…|塞德…|someCommand>out.txt
这怎么可能

更新 我在下面试用了@Charles Duffy的版本,但对
bzip2
-部分做了一些修改,改为使用
bzcat
。我认为它没有那么冗长,并且不应该影响性能(尽管不确定)


这就完成了工作。但是,现在最好将此管道包括进来,以获得有关进度的一些反馈(有许多
*.bz2
文件!)。用
pv-cN source<…
作为整个事件的前缀不起作用。我为此发布了一个单独的问题

您可以使用重定向和
tee

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

echo
的输出分为两个流,一个流由
wc
处理,然后进入&3,显示在输出上。另一个将通过
排序
进行进一步处理,并保存到
输出
文件中。

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

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

注意
-exec。。。{}+
,这比您以前使用的
find
操作(为每个输出文件运行一个单独的
bzip2
副本)效率要高得多。

使用查看
bzgrep
作为旁白,
find-name
的可移植性不如
find-名称
;省略起始目录名的功能是GNU扩展。
的意义是什么这里?按照我阅读问题的方式,您不想反转任何运算符。已确认(缺少的
)。
丢失,并且
在编写实际管道的简化(抽象)版本时意外插入。我相应地更新了问题中的代码。谢谢你的提示!我尝试过这个(经过修改),它似乎有效。谢谢你。现在,将其与集成将非常好。我想离这里只有一小步,但我无法让它工作。我相应地更新了问题。我知道这不再是原始问题的一部分,但如果你能给我指出正确的方向,那就太好了:)我们确实需要更多关于如何使用
pv
的定义。如果您希望根据处理的文件数量创建一个适当的百分比对话框,那么在开始处理任何文件之前,我们需要生成完整的文件列表(这样我们就知道有多少个文件);这意味着我们将在稍后开始,因为我们无法在找到第一个文件后立即解压缩。类似地,要获得基于行数的百分比,我们需要计算总行数。让
pv
仅发出一个速率(已处理的文件或行数,或您拥有的其他内容)会更容易,但无论哪种方式,我们都处在一个需要指定足够详细信息的位置,需要提出一个明确的问题。你是对的。我将您的答案标记为正确答案,并删除了问题中的代码片段。针对管道查看器的问题,我提出了一个新问题
result=$(find . -name '*bz2' -exec bzip2 -k -c -d {} + \
          | tee >(sed ... | sed ... | someCommand >out.txt) \
          | grep -e myString \
          | wc -l)