Команда awk не работает в snakemake --use-singularity

Я пытаюсь объединить 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

3 ответа

У меня была похожая проблема, и после долгих проб и ошибок я наконец решил ее. В настоящее время (ноябрь 2018 года, для Snakemake 5.3) это несколько недокументировано, поэтому я подумал, что было бы неплохо поместить его здесь для дальнейшего использования, чтобы помочь другим...

Во всех вышеприведенных примерах неверно используется двойная кавычка с bash -c, а это не то, как Snakemake ее создает. Вместо этого Snakemake вызывает Singularity с bash -c ' modified_command 'так что одинарные кавычки. Во-первых, это меняет способ обработки специальных символов в команде. Во-вторых, на данный момент Snakemake заменяет все одинарные кавычки внутри фактической команды на экранированную версию \'. Однако это относится ТОЛЬКО при использовании с Singularity.

Таким образом, если ваша команда содержит одинарные кавычки, все прерывается либо при отправке с параметром --use-singularity, либо при работе в обычном режиме. Единственное известное мне рабочее решение, которое работает в обоих случаях:

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

Таким образом, применяются следующие правила:

  1. Не используйте одинарные кавычки внутри команды, так как они заменяются иначе, что приводит к ошибкам.
  2. Избегайте определенных символов, таких как \t by \\t, $ by \$ и { by {{.
  3. Используйте тройные кавычки, чтобы окружить вызов командной строки.

Я надеюсь, что это поможет, я буду обновлять этот пост, как только появятся обновления реализации.

$ должен быть экранирован при запуске с 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}"

Я попробовал ваш пример, и он отлично работал с последней версией Snakemake 5.1.4. Вы уверены, что это проблема для вас после обновления до последней версии?

Другие вопросы по тегам