5

我正在尝试将 Snakemake 与 Singularity 结合使用,我注意到awk使用奇异性时,一个简单的命令不再起作用。最后$1一行中的 bash 被替换,而不是被用作第一个字段awk

这是一个最小的工作示例(Snakefile):

singularity: "docker://debian:stretch"
rule all:
    input: "test.txt"
rule test:
    output: 
        "test.txt"
    shell:
        "cat /etc/passwd | awk -F':' '{{print $1}}' > {output}"

当我在snakemake没有奇点的情况下运行时,输出test.txt看起来像预期的那样(仅包含用户名)。当我运行时snakemake --use-singularity,该文件包含整行,例如root:x:0:0:root:/root:/bin/bash.

这是来自 Snakemake 的日志:

$ snakemake --use-singularity --printshellcmd                                                                                                               
Building DAG of jobs...
Using shell: /usr/bin/bash
Provided cores: 1
Rules claiming more threads will be scaled down.
Job counts:
        count   jobs
        1       all
        1       test
        2

rule test:
    output: test.txt
    jobid: 1

cat /etc/passwd | awk -F':' '{print $1}' > test.txt
Activating singularity image /scratch/test/.snakemake/singularity/fa9c8c7220ff16e314142a5d78ad6cff.simg
Finished job 1.
1 of 2 steps (50%) done

localrule all:
    input: test.txt
    jobid: 0

Finished job 0.
2 of 2 steps (100%) done
4

3 回答 3

8

我有一个类似的问题,经过大量的试验和错误终于解决了。目前(2018 年 11 月,对于 Snakemake 5.3),这有点无证,所以我认为最好把它放在这里以供将来参考以帮助其他人......

上面的所有示例都错误地使用了双引号和 bash -c,这不是 Snakemake 构造它的方式。相反,Snakemake 用bash -c ' modified_command ', 所以单引号调用 Singularity。首先,这改变了命令中特殊字符的处理方式。其次,到目前为止,Snakemake 将实际命令中的所有单引号替换为转义版本 \'。但是,这仅适用于与 Singularity 一起使用时。

因此,如果您的命令包含单引号,则在使用 --use-singularity 提交或在正常模式下运行时会中断。我知道在这两种情况下都有效的唯一有效解决方案如下:

shell: """awk "{{OFS="\\t"}};{{print \$2}}" {input}"""

因此,以下规则适用:

  1. 不要在命令中使用单引号,否则它们会被替换,这会导致错误。
  2. 转义某些字符,例如 \t 转义为 \\t,$ 转义为​​ \$,{ 转义为 {{。
  3. 使用三引号将命令行调用括起来。

我希望这会有所帮助,一旦有实施更新,我将更新这篇文章。

于 2018-11-20T00:58:03.367 回答
1

运行时$需要转义.bash -c

$ bash -c "cat temp.tab | awk '{if (\$1==1) print;}' " | head -2
1       26554252        26554595        1       1 
1       156246251       156246680       2       2  

$ bash -c "cat temp.tab | awk '{if ($1==1) print;}' " | head -2
awk: cmd. line:1: {if (==1) print;}
awk: cmd. line:1:      ^ syntax error

将您的蛇形代码更改为:

...
shell:
    "cat /etc/passwd | awk -F':' '{{print \$1}}' > {output}"
于 2018-07-10T00:02:16.667 回答
0

我试过你的例子,它在最新的 Snakemake 版本 5.1.4 上运行良好。您确定更新到最新版本后这仍然是您的问题吗?

于 2018-06-24T11:21:51.727 回答