38.《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命令压缩并重定向保存结果,也可以传入其它的命令处理。

你可能感兴趣的:(38.《Bioinformatics Data Skills》之命名管道与进程替换)