[英]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.