美文网首页生物信息数据科学
38.《Bioinformatics Data Skills》之

38.《Bioinformatics Data Skills》之

作者: DataScience | 来源:发表于2021-07-05 19:40 被阅读0次

    当我们使用的程序输入与输出的是多个文件,无法使用管道命令。生物信息学的程序中这种情况实际是比较常见的,假如说程序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》之

        本文链接:https://www.haomeiwen.com/subject/trviultx.html