0


我正在尝试创建用于分析生物数据的自动命令链。
为此,我在 Slurm 集群中使用 Samtools。下面这一行是我为分析运行的命令之一:
samtools view -h file.sam | awk '$6 ~ /N/ || $1 ~ /^@/' | samtools view -h > spliced.file.sam
使用它,我得到了预期的输出(简单)。
但是,当我想将命令插入作业时,--wrap会出现语法错误。
如图所示:

sbatch --wrap "samtools view -h file.sam | awk '$6 ~ /N/ || $1 ~ /^@/' | samtools view -h > sp.file.sam"

    awk:  ~ /N/ ||  ~ /^@/
    awk:  ^ syntax error

srun在命令的开头和结尾使用&,在提交时非常有用,但是当我想创建命令管道时可以使用它吗?我可以为这个命令添加依赖项吗?有没有可能使用
--wrap这个命令的方法?

我的目标是创建一个自动命令管道,如下面的链接所示 - https://gencore.bio.nyu.edu/building-an-analysis-pipeline-for-hpc-using-python/

提前致谢。

4

2 回答 2

0

最直接的方法是编写

samtools view -h file.sam | awk '$6 ~ /N/ || $1 ~ /^@/' | samtools view -h > spliced.file.sam

到 shell 脚本的行(例如myscript.sh

#!/usr/bin/env bash

file=${1?Usage: $0 <file.sam>}

samtools view -h "$file" | awk '$6 ~ /N/ || $1 ~ /^@/' | samtools view -h > spliced.file.sam

这样你就可以发出

sbatch --wrap "./myscript.sh file.sam"

无需使用引号管理 shell 转义。这将进一步允许您运行这样的命令

find . -name \*.sam -print0 | xargs -0 -I{} sbatch --wrap "./myscript.sh {}"

这将为在当前目录中找到的每个文件提交一个作业.sam,或者在 Python 脚本中使用它,就像您提到的参考文献一样。

于 2022-02-17T10:01:33.120 回答
0

这与单引号无关。你可以做

sbatch --wrap="samtools view | head| awk '{print}'"

它会工作得很好。

如果您不想将命令保存在 shell 脚本中,则需要转义 AWK 命令中的美元符号。

sbatch --wrap "samtools 视图 -h file.sam | awk '\$6 ~ /N/ || \$1 ~ /^@/' | samtools 视图 -h > sp.file.sam"

错误是:

awk: ~ /N/ || ~ /^@/

与您运行的命令相比,字段运算符($6 和 $1)都没有进入 sbatch 提交,这意味着美元符号很可能给您带来了麻烦。我遇到了类似的问题,并且逃避了所有对我有用的 $。

于 2022-02-22T20:16:08.013 回答