snakemake规则删除文件

时间:2018-10-03 21:43:42

标签: python snakemake

我有一个大的蛇形文件,看起来很简单(简化很多之后)。

rule a:
    input: '{path}.csv'
    output: '{path}.a.csv'
    shell: 'cp {input} {output}'
rule b:
    input: '{path}.csv'
    output: '{path}.b.csv'
    shell: 'cp {input} {output}'
rule c:
    input: '{path}.csv'
    output: '{path}.c.csv'
    shell: 'cp {input} {output}'
rule d:
    input: '{path}.csv'
    output: '{path}.d.csv'
    shell: 'cp {input} {output}'
rule all:
    input: 'raw1.a.b.c.a.d.csv',
           'raw2.a.b.c.d.a.csv'

(此设置通过链接all规则中的文件名后缀,使我可以使用函数之类的规则。)

开始状态:

$ ls -tr1
Snakefile
raw1.csv
raw2.csv

$ snakemake all
...

之后:

$ ls -tr1
Snakefile
raw1.csv
raw2.csv
raw2.a.csv
raw2.a.b.csv
raw2.a.b.c.csv
raw2.a.b.c.d.csv
raw1.a.csv
raw1.a.b.csv
raw1.a.b.c.csv
raw1.a.b.c.a.csv
raw1.a.b.c.a.d.csv
raw2.a.b.c.d.a.csv

现在,我想添加一条规则,该规则删除特定的中间文件(例如raw1.a.csvraw2.a.b.csv),因为我不需要它们并且它们会占用了大量磁盘空间。由于通配符temp(),我无法用{path}标记输出。

有什么提示吗?谢谢。

2 个答案:

答案 0 :(得分:1)

temp()在这种情况下确实可以工作。

rule all:
    input: 'raw1.a.b.c.a.d.csv',
        'raw2.a.b.c.d.a.csv'

rule a:
    input: '{path}.csv'
    output: temp('{path}.a.csv')
    shell: 'cp {input} {output}'
rule b:
    input: '{path}.csv'
    output: '{path}.b.csv'
    shell: 'cp {input} {output}'
rule c:
    input: '{path}.csv'
    output: temp('{path}.c.csv')
    shell: 'cp {input} {output}'
rule d:
    input: '{path}.csv'
    output: '{path}.d.csv'
    shell: 'cp {input} {output}'

执行此操作将导致创建文件raw1.a.b.c.a.d.csv , raw1.a.b.csv, raw2.a.b.c.d.csv, raw2.a.b.csv和自动删除文件raw1.a.csv, raw2.a.csv, raw1.a.b.c.csv, raw2.a.b.c.csv, raw1.a.b.c.a.csv, raw2.a.b.c.d.a.csv

答案 1 :(得分:0)

编辑:实际上,该解决方案不起作用..它会导致比赛状态...


好吧,我知道了...

#XYZ

这是dag:

rule a:
    input: '{path}.csv'
    output: '{path}.a.csv'
    shell: 'cp {input} {output}'
rule b:
    input: '{path}.csv'
    output: '{path}.b.csv'
    shell: 'cp {input} {output}'
rule c:
    input: '{path}.csv'
    output: '{path}.c.csv'
    shell: 'cp {input} {output}'
rule d:
    input: '{path}.csv'
    output: '{path}.d.csv'
    shell: 'cp {input} {output}'
rule remove:                          # <-- rule to delete a file
    input: '{path}'
    output: touch('{path}.removed')
    shell: 'rm {input}'
rule all:
    input: 'raw1.a.b.c.a.d.csv',
           'raw2.a.b.c.d.a.csv',
           'raw1.a.csv.removed',      # <-- specify which files to rm
           'raw2.a.b.c.csv.removed',  # <-- specify which files to rm

enter image description here