Snakemake,使用glob_wildcards跳过子目录的任何方式

问题描述 投票:1回答:2

我是SnakeMake的新手。我正在尝试通过这个简单的Snakefile自己教它:

(IDS, ) = glob_wildcards( "{id}.txt" )
print ( str ( IDS ) )

rule all:
    input:
        expand ( "out/{id}-1.txt", id = IDS )

rule copy:
    input:
        "{id}.txt"
    output:
        "out/{id}-1.txt"
    shell:
        "cp {input} {output}"

我第一次运行它(当尚不存在时),它运行良好并创建了三个副本。下次,IDS包含'out/c-1', 'out/a-1', 'out/b-1',这当然不是我想要的,因为我希望glob_wildcards仅扫描第一级。有什么方法可以做到,也许用函数接收到的regex参数?

到目前为止,在创建IDS之后,我仅通过过滤器对其进行管理:

IDS = [ id for id in IDS if '/' not in id ]

但是我希望有更紧凑的东西。

snakemake
2个回答
1
投票

根据我在glob_wildcards实现中看到的内容,此函数没有任何限制级别的参数。这意味着您的解决方案(1行代码)可能是最紧凑的解决方案,以防您确实需要将输出文件夹作为输入的嵌套文件夹。

简单的解决方案是将输入和输出分离到同级文件夹中。在这种情况下,以下代码将在一个干净的输入文件夹中搜索,该文件夹永远不会污染输出:

(IDS, ) = glob_wildcards( "path_to_input/{id}.txt" )

0
投票

我同意单独的目录是解决此问题的最简单方法。您也可以使用wildcard constraints告诉snakemake您的ID不包含'/'

(IDS, ) = glob_wildcards("{id,[^/]+}.txt")
© www.soinside.com 2019 - 2024. All rights reserved.