Unix Pipe作为Unix模块化的核心,兼具速度与美学。它与输出流重定向的区别在于,输出流重定向是将程序的输出内容保存在文件,而管道的作用是将一个程序的输出作为另一个程序的输入(标准错误还是会打印在屏幕上,fig.1)。
内存读写的速度远高于磁盘读写,所以程序运行速度的瓶颈通常会来源于文件的读写。使用管道可以提高运行速度,节约磁盘空间。
管道示例
以一个简单的例子来说明,这里有一个FASTQ文件(如下图)
cat tb1.fasta
>gi|385663969|gb|JQ900508.1| Zea mays subsp. mexicana isolate IS9 teosinte branched 1 (tb1) gene, complete cds
GCCAGGACCTAGAGAGGGGAGCGTGGAGAGGGCATCAGGGGGCCTTGGAGTCCCATCAGTAAAGCACATG
TTTCCTTTCTGTGATTCCTCAAGCCCCATGGACTTACCGCTTTACCAACAACTGCAGCTAAGCCCGTCTT
CCCCAAAGACGGACCAATCCAGCAGCTTCTACTGCTAYCCATGCTCCCCTCCCTTCGCCGCCGCCGACGC
CAGCTTTCCCCTCAGCTACCAGATCGGTAGTGCCGCGGCCGCCGACGCCACCCCTCCACAAGCCGTGATC
AACTCGCCGGACCTGCCGGTGCAGGCGCTGATGGACCACGCGCCGGCGCCGGCTACGGCTACAGAGCTGG
GCGCCTGCGCCAGTGGTGCAGAAGGATCCGGCGCCAGCCTCGACAGGGCGGCTGCCGCGGCGAGGAAAGA
CCGGCACAGCAAGATATGCACCGCCGGCGGGATGAGGGACCGCCGGATGCGGCTCTCCCTTGACGTCGCG
CGCAAATTCTTCGCGCTGCAGGACATGCTTGGCTTCGACAAGGCAAGCAAGACGGTACAGTGGCTCCTCA
ACACGTCCAAGTCCGCCATCCAGGAGATCATGGCCGACGACGCGTCTTCGGAGTGCGTGGAGGACGGCTC
CAGCAGCCTCTCCGTCGACGGCAAGCACAACCCGGCAGAGCAGCTGGGAGGAGGAGGAGATCAGAAGCCC
AAGGGTAATTGCCGCGGCGAGGGGAAGAAGCCGGCCAAGGCAAGTAAGGCGGCGGCCACCCCGAAGCCGC
CAAGAAAATCGGCCAATAACGCACACCAGGTCCCCGACAAGGAGACGAGGGCGAAAGCGAGGGAGAGGGC
GAGGGAGCGGACCAAGGAGAAGCACCGGATGCGCTGGGTAAAGCTTGCTTCAGCAATTGACGTGGAGGCG
GCGGCTGCCTCGGGGCCGAGCGACAGGCCGAGCTCGAACAATTTGAGCCACCACTCATCGTTGTCCATGA
ACATGCCGTGTGCTGCCGCTGAATTGGAGGAGAGGGAGAGGTGTTCATCAGCTCTCAGCAATAGATCAGC
AGGTAGGATGCAAGAAATCACAGGGGCGAGCGACGTGGTCCTGGGCTTTGGCAACGGAGGAGGAGGATAC
GGCGACGGCGGCGGCAACTACTACTGCCAAGAGCAATGGGAACTCGGTGGAGTCGTCTTTCAGCAGAACT
CACGCTTCTACTGAACACTACGGGCGCACTAGGTACTAGAACTACTCTTTCGACTTACATCTATCTCCTT
TCCCTCAACGTGAGCTTCTCAATAATTTGCTGTCTTAATCTATGCGTGTGTTTCTCTTTCTAGACTTCGT
AATTGGCTGTGTGACGATGAACTAAGTTTGGTCATCGCATGATGATGTATTATAGCTAGCTAGCATGCAC
TGTGGCGTTGATTCAATAATGGAATTAATCGGTGTCGTCGATTTGGTGATTTCCGAACTGAATCTCTGTG
ATGAACGAGATCAAACAGTATCCGCCGGTGACGGACGTTCATTACTATTGGCAAGCAAAGCAAGTACTAA
TGTAATTCAGCTGTTTGATGACAGAATGAAAAAAATGTTGAAGGCTGAAGCTATAACATGCTGAAAGAGA
GGCTTTTGCTAGGTAAAAGTCTAGCTCACAAGGTCAATTCCATGATGCCGTTTGTATGCATGTTAAAATC
TGCACCTAATGGCGCGGCTTTATATAGTCTTATAATTCATGGATCAAACATGCCGATC
我们可以通过以下命令来搜索非碱基的字母:
grep -v "^>" tb1.fasta | \
grep --color -i "[^ACTG]"
# CCCCAAAGACGGACCAATCCAGCAGCTTCTACTGCTAYCCATGCTCCCCTCCCTTCGCCGCCGCCGACGC
注:
- 我们找到的一行包含字母“Y”,它也是一个IUPAC标准字符代表C或者T。
- grep作为常用的文本匹配命令。引号里面是待匹配的正则表达式(加引号是一个好习惯,否则>会被程序理解为重定向);
- 第一行中:
^>
代表以">"开头的行,-v
表示反向匹配,意思是在tbl.fasta
里面寻找非">"开头的文本; -
\
只是为了换行,来提高可读性 - 第二行中:
--color
对匹配结果加颜色,更醒目,-i
代表不区分大小写(ignore case),[^ACTC]
中^
是取非的意思,意思是不区分大小写地匹配包含非ACTG字符的行。
结合管道与重定向
- 有时候我们需要将程序的标准错误信息存储为log文件,可以结合管道与重定向:
program1 inputfile 2> program1.err | program2 2> program2.err > result.txt
- 如果我们想结合标准输出和标准出错来查找某一信息(例如错误),可以将标准出错重定向到标准输出:
program inputfile 2>&1 | grep "error"
如果想将标准出错信息同时重定向到文件中可以采用下面的方式(见解释):
program inputfile > result.txt 2>&1
使用tee命令在管道中重定向
有时候我们采用管道来连接不同的程序,但是出于程序调试或者存储重要结果等不同的目的我们同时也想要保存中间结果。我们可以中管道中追加tee命令来达到目的:
program1 inputfile | tee intermediatefile.txt | program2 > result.txt
网友评论