Как выполнять простые строковые операции в выводе 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} так, чтобы использовалось только имя файла с расширением. Я не мог найти ничего в документах или в связанных с ними вопросах.

422   5  

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.

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)
Питон лежит в основе змеиного змия. Я предпочитаю директиву "run " директиве" shell", потому что я нахожу ее действительно открывает много этой прекрасной функциональности Python. Доступ к парам и различным вещам немного отличается от доступа к директиве" shell".

Например

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

    Ничего не найдено.