Snakemake 规则使用通配符简化文件名

Snakemake Rule to simplify file names using wildcards

输入数据

.
├── barcode01
│   └── fastq_runid_6292747b0109c4fa5918c50eb8204bb715f19ad0_0.fastq
├── barcode02
│   └── fastq_runid_6292747b0109c4fa5918c50eb8204bb715f19ad0_0.fastq
├── barcode03
│   └── fastq_runid_6292747b0109c4fa5918c50eb8204bb715f19ad0_0.fastq
├── barcode04
│   └── fastq_runid_6292747b0109c4fa5918c50eb8204bb715f19ad0_0.fastq

Snakemake 规则

rule symlink_results_demultiplex:
    input:
        inputdirectory+"/basecall/demultiplex/{sample_demultiplex}/{sample_runid}.fastq"
    output:
        outdirectory+"/mothur/{sample_demultiplex}.fastq"
    threads: 1
    shell:
        "ln -s {input} {output}"

但是这个错误是因为没有使用相同的通配符。我想创建一个仅包含 barcode01.fastq 作为输出文件的符号链接。我想删除多余的“fastq_runid_6292747b0109c4fa5918c50eb8204bb715f19ad0_0”部分。

执行此操作的最佳方法是什么?

一个选项是在仅依赖于 {sample_demultiplex} 通配符的函数中查找输入的文件名。此示例代码可能适用于此,具体取决于您的文件夹设置方式(现在它假设每个 {sample_demultiplex} 通配符仅对应于一个 fastq 文件。)

import os
import glob

def get_symlink_results_demultiplex_input(wildcards):
    fastq_dir = os.path.join(inputdirectory, "/basecall/demultiplex/", wildcards.sample_demultiplex)
    fastq_file = glob.glob("*.fastq", root_dir=fastq_dir)[0] # this assumes there is only ever one fastq file in a directory
    return os.path.join(fastq_dir, fastq_file)
    

rule symlink_results_demultiplex:
    input:
        get_symlink_results_demultiplex_input
    output:
        outdirectory+"/mothur/{sample_demultiplex}.fastq"
    threads: 1
    shell:
        "ln -s {input} {output}"