Input Snakemake使用扩展但不重复的多个输入文件

Input Snakemake使用扩展但不重复的多个输入文件,input,selection,expand,snakemake,Input,Selection,Expand,Snakemake,我是个新手,不知道怎么解决这个问题 我的规则有两个输入: rule test input_file1=f1 input_file2=f2 f1的单位为[A{1}$,A{2}%,B{1}€,B{2}%] f2位于[C{1},C{2}] 这些数字是来自扩展调用的通配符。我需要找到一种方法,将一对与数字完全匹配的文件传递给文件f1和f2。例如: f1=A1 f2=C1 或 f1=B1 f2=C1 我必须避免组合,例如: f1=A1 f2=C2 我将创建一个函数,用于在文件之间进行此类

我是个新手,不知道怎么解决这个问题

我的规则有两个输入:

rule test
    input_file1=f1
    input_file2=f2
f1的单位为[A{1}$,A{2}%,B{1}€,B{2}%]

f2位于[C{1},C{2}]

这些数字是来自扩展调用的通配符。我需要找到一种方法,将一对与数字完全匹配的文件传递给文件f1和f2。例如:

f1=A1

f2=C1

f1=B1

f2=C1

我必须避免组合,例如:

f1=A1

f2=C2

我将创建一个函数,用于在文件之间进行此类匹配,但该函数应同时管理输入文件1和输入文件2。我想创建一个函数,创建一个具有不同允许组合的字典,但在扩展过程中如何“迭代”它呢


谢谢

假设rule
test
在输出中给您一个名为
{f1}.{f2}.txt
的文件,那么您需要一些机制来正确地配对f1和f2,并创建一个
{f1}.{f2}.txt
文件列表

如何创建此列表取决于您,
expand
只是一个方便的函数,但在这种情况下,您可能希望避免它

下面是一个超级简单的示例:

fin1 = ['A1$', 'A2£', 'B1€', 'B2¥']
fin2 = ['C1', 'C2']

outfiles = []
for x in fin1:
    for y in fin2:
        ## Here you pair f1 and f2. This is a very trivial way of doing it:
        if y[1] in x:
            outfiles.append('%s.%s.txt' % (x, y))

wildcard_constraints:
    f1 = '|'.join([re.escape(x) for x in fin1]),
    f2 = '|'.join([re.escape(x) for x in fin2]),

rule all:
    input:
        outfiles,        

rule test: 
    input:
        input_f1 = '{f1}.txt',
        input_f2 = '{f2}.txt',
    output:
        '{f1}.{f2}.txt',
    shell:
        r"""
        cat {input} > {output}
        """
此管道将执行以下命令

cat A2£.txt C2.txt > A2£.C2.txt
cat A1$.txt C1.txt > A1$.C1.txt
cat B1€.txt C1.txt > B1€.C1.txt
cat B2¥.txt C2.txt > B2¥.C2.txt

如果用
触摸开始输入文件,触摸'A1$.txt''A2.txt''B1€.txt''B2¥.txt''C1.txt''C2.txt'
您应该能够运行此示例。

谢谢!我明白了:如果我是对的,您正在过滤
outfiles
中的“匹配”文件,因此snakemake知道它必须创建什么。是的,
outfiles
是您想要的文件列表,snakemake不关心您如何构建此列表。Snakemake只需要生成这些文件的规则。