為同時運行的多個檔案輸出 stdout 和 stdin

為同時運行的多個檔案輸出 stdout 和 stdin

我有以下適用於 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 仍然會使用它們來觸發檔案總管中的操作,但它們只是檔案名稱的一部分。

因此stdoutstdout.fq是不同的文件。的名稱stdout也是/dev/stdoutstdin/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/stdinand /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

相關內容