我试图将通过snakemake工作流程创建的文件串联起来作为最后一条规则。为了分隔和识别每个文件的内容,我首先在外壳中回显每个文件名作为分隔标签(请参见下面的代码)
rule cat:
input:
expand('Analysis/typing/{sample}_type.txt', sample=samples)
output:
'Analysis/typing/Sum_type.txt'
shell:
'echo {input} >> {output} && cat {input} >> {output}'
我一直在寻找这种格式的结果:
样本1的文件名
样本1的内容
样本1的文件名 2
样品2的含量
相反,我得到了以下格式:
样本1的文件名样本2的文件名...
样本1的内容 样品2的含量...
snakemake似乎先并行执行echo命令,然后再执行cat命令。我该怎么办才能得到我想要的格式?
谢谢
答案 0 :(得分:1)
与Snakemake问题相比,这看起来更像是外壳问题。
如果要替换文件名和内容,则可以在输入文件上使用循环,如下所示:
# Just an example:
samples = ["A", "B", "C"]
rule all:
input:
'Analysis/typing/Sum_type.txt'
rule cat:
input:
expand('Analysis/typing/{sample}_type.txt', sample=samples)
output:
'Analysis/typing/Sum_type.txt'
shell:
"""
for file in {input}
do
echo ${{file}} >> {output}
cat ${{file}} >> {output}
done
"""
(双花括号避免将预期的shell变量file
解释为Snakemake / Python在计算传递给shell的字符串时应“插入”的东西。)
答案 1 :(得分:0)
您获得的输出与bash的工作方式一致,而不是与snakemake一致。无论如何,我认为做蛇的方法是将文件名添加到每个文件的文件内容中的规则,以及连接输出的规则。例如。 (未检查错误):
rule cat:
input:
'Analysis/typing/{sample}_type.txt',
output:
temp('Analysis/typing/{sample}_type.txt.out'),
shell:
r"""
echo {input} > {output}
cat {input} >> {output}
"""
rule cat_all:
input:
expand('Analysis/typing/{sample}_type.txt.out', sample=samples)
output:
'Analysis/typing/Sum_type.txt'
shell:
r"""
cat {input} > {output}
"""