首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有不同文件名的多个目录上的glob_wildcards

具有不同文件名的多个目录上的glob_wildcards
EN

Stack Overflow用户
提问于 2018-05-18 14:19:00
回答 1查看 2.9K关注 0票数 2

我正在尝试编写一个规则,它从不同的目录中获取两个文件,并将规则的输出放到与下面的文件结构相同的目录中:

代码语言:javascript
复制
DIR_A 
    dir1    
        file1.clean.vcf  
    dir2  
        file2.clean.vcf  
    dir3
        file1.output.vcf
        file2.output.vcf

到目前为止,我已经尝试使用glob_wildcards:

代码语言:javascript
复制
(DIR,NAME) = glob_wildcards("DIR_A/{dir}/{name}.clean.vcf") 
input: expand("DIR_A/{dir}/{name}.clean.vcf", dir=DIR, name=NAME)
output: "DIR_A/dir3/{name}.output.vcf

但它会抛出一个错误:

代码语言:javascript
复制
MissingInputException in line 80 of DIR_A:
Missing input files for rule convert_output:

DIR_A/dir1/file2.clean.vcf
DIR_A/dir2/file1.clean.vcf

将zip添加到输入:

代码语言:javascript
复制
input: expand("DIR_A/{dir}/{name}.clean.vcf", zip, dir=DIR, name=NAME)

如果$ snakemake -s snakefile -n (试运行):

代码语言:javascript
复制
rule conv_output:
input: DIR_A/dir1/file1.clean.vcf, DIR_A/file2/file2.clean.vcf

这被snakemake接受并防止了上述错误,但是现在file1.clean.vcf和file2.clean.vcf都是规则的输入,但是{name}通配符使规则在每个文件中运行一次。这最终成为一个文件的许多文件,而不是我正在寻找的一对一。

是否有一种方法来设置它,这样我就可以得到规则conv_output的输出来处理每个文件,然后将输出放在dir3中?任何帮助都将不胜感激!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-18 17:55:46

使用python,将输入的vcf示例/文件名对其路径进行配对,然后使用它在snakemake规则中指定输入路径。下面的例子适用于问题中给出的目录结构。

代码语言:javascript
复制
from pathlib import Path   

def pair_name_to_infiles():
    # get all *.clean.vcf files recursively under DIR_A
    vcf_path = Path('DIR_A').glob('**/*.clean.vcf')

    # pair vcf name to infile path using a dictionary
    vcf_infiles_dict = {}
    for f in vcf_path:
        vcf_name = f.name.replace('.clean.vcf', '')
        vcf_infiles_dict[vcf_name] = str(f)

    return vcf_infiles_dict


# using function written in python code, map vcf name to their infile path
vcf_infiles_dict = pair_name_to_infiles()


rule all:
    input:
        expand('DIR_A/dir3/{vcf_name}.output.vcf', vcf_name=vcf_infiles_dict.keys())


rule foo:
    input:
        lambda wildcards: vcf_infiles_dict[wildcards.vcf_name]
    output:
        'DIR_A/dir3/{vcf_name}.output.vcf'
    shell:
        'touch {output}'
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50413374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档