2017-09-26 104 views
2

我正在創建我的第一個snakemake文件,並且我需要對我的output的值執行簡單的字符串操作,以便我的shell命令按預期工作:如何在snakemake輸出中執行簡單的字符串操作

rule sketch: 
    input: 
    'out/genomes.txt' 
    output: 
    'out/genomes.msh' 
    shell: 
    'mash sketch -l {input} -k 31 -s 100000 -o {output}' 

我需要的split功能應用於{output},這樣僅使用文件到擴展名。我無法在文檔或相關問題中找到任何內容。

回答

1

你可以在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//")' 
+0

這是迄今爲止最優雅的解決方案,儘管原則上可以對輸入/輸出執行非常基本的操作。傷心! – mgalardini

3

您可以使用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}' 
2

避免重複的文字。除非將輸入/輸出轉換爲通配符+擴展,否則不要使用參數。否則,你會留下難以維護的規則。

input: 
    "{pathDIR}/{genome}.txt" 
output: 
    "{pathDIR}/{genome}.msh" 
params: 
    dir: '{pathDIR}/{genome}' 

否則,use Python's slice notation

我似乎無法使用輸出通配符在參數中使用切片符號。它在運行指令中。

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) 

Python是Snakemake的基礎。我更喜歡通過「shell」指令的「run」指令,因爲我發現它真正解開了許多美麗的Python功能。 params和各種東西的訪問與「shell」指令略有不同。

E.g.

callString=config["mpileup_samtoolsProg"] + ' view -bh -F ' + str(config["bitFlag"]) + ' ' + str(input.inputBAM) + ' ' + wildcards.chrB2M[1:] 

A bit of a snippet of J.K. using the run directive.

All of the rules in my modules pretty much use the run directive

3

替代的解決方案中使用通配符:

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解決方案相比,其優勢在於其更好地推廣。

1

最好是使用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不能與康達環境相結合。