为同时运行的多个文件输出 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

相关内容