我正在尝试将 Snakemake 与 Singularity 结合起来,我注意到一个简单的awk
使用奇点时命令不再起作用。这$1
最后一行被 bash 替换,而不是被用作第一个字段awk
.
这是一个最小的工作示例(蛇形锉刀):
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
我遇到了类似的问题,经过多次尝试和错误终于解决了。目前(2018 年 11 月,对于 Snakemake 5.3),这有点没有记录,所以我认为最好将其放在这里以供将来参考以帮助其他人......
上面的所有示例都错误地在 bash -c 中使用了双引号,这不是 Snakemake 的构造方式。相反,Snakemake 称奇点为bash -c ' modified_command '
,所以单引号。
首先,这改变了命令中处理特殊字符的方式。其次,到目前为止,Snakemake 将实际命令中的所有单引号替换为转义版本 \'。然而,这仅适用于与 Singularity 一起使用时。
因此,如果您的命令包含单引号,则在使用 --use-singularity 提交或在正常模式下运行时会出现问题。据我所知,在这两种情况下都有效的唯一可行的解决方案如下:
shell: """awk "{{OFS="\\t"}};{{print \$2}}" {input}"""
因此,适用以下规则:
- 不要在命令中使用单引号,否则它们会被替换,从而导致错误。
- 对某些字符进行转义,例如将 \t 转义为 \\t,将 $ 转义为 \$,以及将 { 转义为 {{。
- 使用三引号将命令行调用引起来。
我希望这会有所帮助,一旦有实施更新,我将更新这篇文章。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)