这似乎是一个基本问题,但我不断得到一些变化的错误:No values given for wildcard
。
我有22个名为Ne-sQTL_perind.counts.gz.qqnorm_chr{#}.gz
的文件。我想按规则对他们采取行动。我最初的样子是这样的:
rule QTLtools_filter:
input:
file=expand("Ne-sQTL_perind.counts.gz.qqnorm_chr{i}.gz",i=range(1,22)),
chk=".prepare_phen_table.chkpnt"
output:
expand("{input.file}.qtltools")
message:
"Making phenotype files QTLtools compatible..."
shell:
"cat {input.file} | awk '{ $4=$4\" . +\"; print $0 }' | tr " " \"\t\" | bgzip -c > {input.file}.qtltools"
但是,我得到No values found for wildcare 'input'
,这使我感到困惑,因为在文档中we have a clear example of this working with the wildcare replicates
。如何扩展此通配符,使其包括1-22之间编号的所有文件?我还尝试根据this SO post的建议定义一个函数来为我完成此操作,但无济于事;仍然是相同的错误消息。
def expandChromo(wildcards):
return expand("Ne-sQTL_perind.counts.gz.qqnorm_chr{i}.gz",i=range(1,22))
...
rule QTLtools_filter:
input:
expandChromo,
chk=".prepare_phen_table.chkpnt"
output:
expand("{wildcards.expandChromo}.qtltools")
message:
"Making phenotype files QTLtools compatible..."
shell:
"cat {wildcards.expandChromo} | awk '{ $4=$4\" . +\"; print $0 }' | tr " " \"\t\" | bgzip -c > {wildcards.expandChromo}.qtltools"
答案 0 :(得分:1)
您需要有2条规则。第一个(我们称其为all
)没有输出,但明确说明了您希望通过管道获得的结果:
rule all:
input: expand("Ne-sQTL_perind.counts.gz.qqnorm_chr{i}.gz.qtltools", i=range(1,22))
这会让Snakemake知道您的22个目标文件。
现在,您可以教Snakemake创建这些文件了:
rule QTLtools_filter:
input:
"{file}.gz"
output:
"{file}.gz.qtltools"
message:
"Making phenotype files QTLtools compatible..."
shell:
"cat {input} | awk '{ $4=$4\" . +\"; print $0 }' | tr " " \"\t\" | bgzip -c > {input}.qtltools"
请注意,此规则将单个文件作为输入,将单个文件作为输出,通配符允许Snakemake为您范围内的每个i
匹配此对。我没有发现将chk=".prepare_phen_table.chkpnt"
设置为输入的任何理由,但这是您可能需要添加的内容。