我有以下適用於 bam 檔案的命令
reformat.sh in=test.bam out=stdout.fq primaryonly | reformat.sh in=stdin.fq out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
這裡的想法是避免將第一個命令(reformat.sh)的輸出寫入文件,這會提高整體速度。
我目前的工作目錄中有幾個 bam 文件,我想在叢集上並行運行它們。如何在上述指令中使用stdout.fq和stdin.fq,以便同時處理多個bam檔案時,stdout.fq/stdin.fq不會互相干擾?
謝謝
答案1
您對檔案副檔名感到非常困惑。哪有這回事。自從 MS-DOS 和 CPM 以來就沒有了。 Microsoft 的 Windows 仍然會使用它們來觸發檔案總管中的操作,但它們只是檔案名稱的一部分。
因此stdout
和stdout.fq
是不同的文件。的名稱stdout
也是/dev/stdout
和stdin
是/dev/stdin
答案2
這要看怎麼reformat.sh
寫。
如果您不給 UNIX 指令任何輸入/輸出,通常 UNIX 指令會使用 stdin 和 stdout:
reformat.sh in=test.bam primaryonly |
reformat.sh out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
其他時候他們會接受 - 作為檔案名稱:
reformat.sh in=test.bam out=- primaryonly |
reformat.sh in=- out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
在現代 Bash 中你可以使用/dev/stdin
and /dev/stdout
:
reformat.sh in=test.bam out=/dev/stdout primaryonly |
reformat.sh in=/dev/stdin out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
為了避免在並行運行作業時發生名稱衝突,我將建立一個函數,該函數將名稱作為參數:
refo() {
in="$1"
out1="$2"1.fq.gz
out2="$2"2.fq.gz
reformat.sh in=/dev/stdin out=/dev/stdout primaryonly |
reformat.sh in=/dev/stdin out1="$out1" out2="$out2" interleaved addcolon
}
並這樣稱呼它:
refo test.bam out
當它起作用時,您可以bam
使用以下方法並行處理多個檔案:
export -f refo
parallel refo {} {.} ::: *.bam