правило 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.csv и raw2.a.b.csv), потому что они мне не нужны, и они занимают много места на диске. Я не могу пометить выходы с помощью temp() из-за подстановочного знака {path}.

Какие-нибудь советы? Спасибо.


person obk    schedule 03.10.2018    source источник
comment
temp действительно работает для выходных данных, содержащих подстановочные знаки.   -  person j08lue    schedule 31.05.2019


Ответы (2)


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.

person Manavalan Gajapathy    schedule 03.10.2018

РЕДАКТИРОВАТЬ: На самом деле это решение не работает .. это приводит к состоянию гонки ...


Хорошо, разобрался ...

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

а вот и даг:

$ snakemake --dag all | dot -Tpng > dag.png

введите описание изображения здесь

person obk    schedule 03.10.2018