[英]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:]
最好是使用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.