使用模式规则合并makefile中的相关文件

使用模式规则合并makefile中的相关文件,makefile,bioinformatics,Makefile,Bioinformatics,我正在使用make编写一个生物数据分析管道。我有一个无法合并相关文件的问题。例如,假设我有四个文件(尽管文件总数和相关文件可能更多):A_1.fastq A_2.fastq B_1.fastq B_2.fastq。当管道并行运行时,我希望每个文件都经过配方,但最后一个文件除外,我希望合并相关文件,例如A.merged.bam B.merged.bam。我不知道如何在make中编写这样的规则 示例生成文件 # chip-seq.mk originalFiles = A_1.fastq A_2.f

我正在使用make编写一个生物数据分析管道。我有一个无法合并相关文件的问题。例如,假设我有四个文件(尽管文件总数和相关文件可能更多):A_1.fastq A_2.fastq B_1.fastq B_2.fastq。当管道并行运行时,我希望每个文件都经过配方,但最后一个文件除外,我希望合并相关文件,例如A.merged.bam B.merged.bam。我不知道如何在make中编写这样的规则

示例生成文件

# chip-seq.mk

originalFiles = A_1.fastq A_2.fastq B_1.fastq B_2.fastq
mergedFiles = A.merged.bam B.merged.bam

all: $(mergedFiles)           

%.merged.bam: %_*.sorted.bam
    # merge bam files
    samtools merge $@ $^

%.sorted.bam: %.bam
    # sort bam
    samtools sort $^ $*.sorted

%.bam: %.sam
    # convert sam to bam
    samtools view -bS $^ > $@

%.sam: %.fastq
    # align reads
    bowtie2 -x genome -U $^ -S $@

你不能用纯模式来做这件事。如何使像
%.*.sorted.bam
这样的通配符与磁盘上的文件匹配

但是,您可以使用一个显式的先决条件列表来完成此操作,仍然可以使用规则的模式:

# convert originalFiles into a sorted.bam filename
# run $(call cvtFiles,A) to get A files, etc.
cvtFiles = $(patsubst %.fastq,%.sorted.bam,$(filter $1_%,$(originalFiles)))

%.merged.bam:
       samtools merge $@ $^

A.merged.bam: $(call cvtFiles,A)
B.merged.bam: $(call cvtFiles,B)
当然,您必须为每个合并文件编写新规则

您可以使用带有eval的循环来执行此操作:

$(foreach P,$(patsubst %.merged.bam,%,$(mergedFiles)),$(eval $P.merged.bam: $(call cvtFiles,$P)))
(未测试…)