當(dāng)我們使用的程序輸入與輸出的是多個文件酿傍,無法使用管道命令侦另。生物信息學(xué)的程序中這種情況實(shí)際是比較常見的凝危,假如說程序program需要2個輸入與2個輸出岁疼,那么其會產(chǎn)生4個中間結(jié)果阔涉。我們知道磁盤讀寫是非常耗費(fèi)時間的操作,如果這個程序是在pipeline的中間出現(xiàn)捷绒,可能會成為整個pipeline速度的瓶頸瑰排。
這里介紹兩種方法解決這個問題:
1. 使用命名的管道
我們可以使用mkfifo
(make first in first out)命令來創(chuàng)建一個命名的管道:
$ mkfifo fqin
它的存在形式很像是一個文件,可以通過ls
查看暖侨,發(fā)現(xiàn)前綴為p(代表其實(shí)際是一個管道):
$ ls -l fqin
prw-r--r-- 1 way way 0 Jul 5 18:56 fqin
可以將內(nèi)容重定向到此管道(結(jié)尾的&保證我們還能使用控制臺):
$ echo "This is a test" > fqin &
[1] 38
我們可以使用cat
讀取內(nèi)容:
$ cat infq
hello
[1]+ Done echo "hello" > infq
到這里為止你可能會存在疑惑椭住,這不就是一個正常文件么?看起來確實(shí)如此字逗,不過它厲害的地方在于它不會向磁盤寫入內(nèi)容京郑,并且它被讀取一次之后內(nèi)容便為空。現(xiàn)在再打印infq
文件已經(jīng)沒有東西了:
$ cat infq
用完之后可以刪除管道:
$ rm infq
2. 進(jìn)程替換
創(chuàng)建命名管道的方式有些繁瑣葫掉,更為快捷的方式是進(jìn)行進(jìn)程替換些举。通過一個簡單的例子來說明:
$ cat <(echo "hello, process substitution")
hello, process substitution
原理如下圖所示:
實(shí)際上<(...)
也是生成一個匿名的管道文件作為輸入,作為輸出采用類似的形式>(...)
俭厚。
這樣的話我們先前提到的program需要2個輸入與2個輸出可以采用如下的方式(假如mkinput
作為創(chuàng)建輸入文件的命令):
program -in1 <(mkinput in1.fa) -in2 <(mkinput in2.fa) -out1 >(gzip > out1.gz) -out2 >(gzip > out2.gz)
這里的兩個結(jié)果傳入gzip
命令壓縮并重定向保存結(jié)果户魏,也可以傳入其它的命令處理。