- 38.《Bioinformatics Data Skills》之
- 28.《Bioinformatics-Data-Skills》之
- 18.《Bioinformatics-Data-Skills》之
- 19.《Bioinformatics-Data-Skills》之
- 【shell笔记>生信|专项】生信数据处理技能手札(3):
- Bioinformatics Data Skills
- 17.《Bioinformatics-Data-Skills》之
- 25.《Bioinformatics-Data-Skills》之
- 25.《Bioinformatics-Data-Skills》之
- 23.《Bioinformatics-Data-Skills》之
当我们使用的程序输入与输出的是多个文件,无法使用管道命令。生物信息学的程序中这种情况实际是比较常见的,假如说程序program需要2个输入与2个输出,那么其会产生4个中间结果。我们知道磁盘读写是非常耗费时间的操作,如果这个程序是在pipeline的中间出现,可能会成为整个pipeline速度的瓶颈。
这里介绍两种方法解决这个问题:
1. 使用命名的管道
我们可以使用mkfifo
(make first in first out)命令来创建一个命名的管道:
$ mkfifo fqin
它的存在形式很像是一个文件,可以通过ls
查看,发现前缀为p(代表其实际是一个管道):
$ ls -l fqin
prw-r--r-- 1 way way 0 Jul 5 18:56 fqin
可以将内容重定向到此管道(结尾的&保证我们还能使用控制台):
$ echo "This is a test" > fqin &
[1] 38
我们可以使用cat
读取内容:
$ cat infq
hello
[1]+ Done echo "hello" > infq
到这里为止你可能会存在疑惑,这不就是一个正常文件么?看起来确实如此,不过它厉害的地方在于它不会向磁盘写入内容,并且它被读取一次之后内容便为空。现在再打印infq
文件已经没有东西了:
$ cat infq
用完之后可以删除管道:
$ rm infq
2. 进程替换
创建命名管道的方式有些繁琐,更为快捷的方式是进行进程替换。通过一个简单的例子来说明:
$ cat <(echo "hello, process substitution")
hello, process substitution
原理如下图所示:
图1实际上<(...)
也是生成一个匿名的管道文件作为输入,作为输出采用类似的形式>(...)
。
这样的话我们先前提到的program需要2个输入与2个输出可以采用如下的方式(假如mkinput
作为创建输入文件的命令):
program -in1 <(mkinput in1.fa) -in2 <(mkinput in2.fa) -out1 >(gzip > out1.gz) -out2 >(gzip > out2.gz)
这里的两个结果传入gzip
命令压缩并重定向保存结果,也可以传入其它的命令处理。
网友评论