gpt4 book ai didi

bash - awk 命令在 snakemake --use-singularity 中失败

转载 作者:行者123 更新时间:2023-11-29 09:29:18 26 4
gpt4 key购买 nike

我正在尝试将 Snakemake 与 Singularity 结合使用,我注意到在使用 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

最佳答案

我遇到了类似的问题,经过反复试验终于解决了。目前(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. 使用三引号将命令行调用括起来。

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

关于bash - awk 命令在 snakemake --use-singularity 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50965417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com