Команда 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}"""
Таким образом, применяются следующие правила:
- Не используйте одинарные кавычки внутри команды, так как они заменяются иначе, что приводит к ошибкам.
- Избегайте определенных символов, таких как \t by \\t, $ by \$ и { by {{.
- Используйте тройные кавычки, чтобы окружить вызов командной строки.
Я надеюсь, что это поможет, я буду обновлять этот пост, как только появятся обновления реализации.
$
должен быть экранирован при запуске с 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. Вы уверены, что это проблема для вас после обновления до последней версии?