簡體   English   中英

如何在snakemake輸出中執行簡單的字符串操作

[英]How to perform simple string operations in snakemake output

我正在創建我的第一個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}以便只使用擴展名前的文件名。 我在文檔或相關問題中找不到任何內容。

你可以使用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解決方案相比的優勢在於它更好地推廣。

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

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

否則, 使用Python的切片表示法

我似乎無法使用輸出通配符在params中使用切片表示法。 這是在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)

Python是Snakemake的基礎。 我更喜歡“run”指令而不是“shell”指令,因為我發現它確實解鎖了很多漂亮的Python功能。 params和各種事物的訪問與“shell”指令略有不同。

例如

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

使用run指令的一小部分JK。

我模塊中的所有規則都使用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環境結合使用。

您可以在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//")'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM