我有以下适用于 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