我有一堆*.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
答案 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
文件中。