Как выполнять простые строковые операции в выводе snakemake
Я создаю свой первый файл snakemake, и я дошел до того, что мне нужно выполнить простую строковую операцию над значением моего output, так что моя команда shell работает так, как ожидалось:
rule sketch:
input:
'out/genomes.txt'
output:
'out/genomes.msh'
shell:
'mash sketch -l {input} -k 31 -s 100000 -o {output}'
Мне нужно применить функцию split к {output} так, чтобы использовалось только имя файла с расширением. Я не мог найти ничего в документах или в связанных с ними вопросах.
5 ответов:
Вы можете удалить расширение в команде shell
rule sketch: input: 'out/genomes.txt' output: 'out/genomes.msh' shell: 'mash sketch -l {input} -k 31 -s 100000 -o $(echo "{output}" | sed -e "s/.msh//")'
Вы можете использовать поле params:
rule sketch: input: 'out/genomes.txt' output: 'out/genomes.msh' params: dir = 'out/genomes' shell: 'mash sketch -l {input} -k 31 -s 100000 -o {params.dir}'
Альтернативное решение с использованием подстановочных знаков:
rule all: input: 'out/genomes.msh' rule sketch: input: '{file}.txt' output: '{file}.msh' shell: 'mash sketch -l {input} -k 31 -s 100000 -o {wildcards.file}'Непроверено, но я думаю, что это должно сработать.
Преимущество перед решением
paramsсостоит в том, что оно лучше обобщает.
Избегайте дублирования текста. Не используйте params, если вы не преобразуете входные / выходные данные в подстановочные знаки + расширения. В противном случае вы остаетесь с правилом, которое трудно поддерживать.
input: "{pathDIR}/{genome}.txt" output: "{pathDIR}/{genome}.msh" params: dir: '{pathDIR}/{genome}'В противном случае, Используйте нотацию среза Python.
Я не мог заставить нотацию среза работать в парах, используя выходной подстановочный знак. Вот он в директиве run.
Питон лежит в основе змеиного змия. Я предпочитаю директиву "run " директиве" shell", потому что я нахожу ее действительно открывает много этой прекрасной функциональности Python. Доступ к парам и различным вещам немного отличается от доступа к директиве" shell".from subprocess import call rule sketch: input: 'out/genomes.txt' output: 'out/genomes.msh' run: callString="mash sketch -l " + str(input) + " -k 31 -s 100000 -o " + str(output)[:-4] print(callString) call(callString, shell=True)Например
callString=config["mpileup_samtoolsProg"] + ' view -bh -F ' + str(config["bitFlag"]) + ' ' + str(input.inputBAM) + ' ' + wildcards.chrB2M[1:]Немного сниппета Ж. К., используя директиву выполнить.
Все правила в моих модулях в значительной степени используют директиву run
Лучше всего использовать
params:rule sketch: input: 'out/genomes.txt' output: 'out/genomes.msh' params: prefix=lambda wildcards, output: os.path.splitext(output[0])[0] shell: 'mash sketch -l {input} -k 31 -s 100000 -o {params.prefix}'Всегда предпочтительнее использовать
paramsвместо директивыrun, поскольку директивуrunнельзя комбинировать с окружениями conda.
Comments