我使用make来编写生物数据分析管道。我有一个问题,我无法合并相关文件。例如,假设我有四个文件(尽管文件总数和相关文件可能更多):A_1.fastq A_2.fastq B_1.fastq B_2.fastq。当管道并行运行时,我希望每个文件都通过除最后一个之外的配方,我想要合并相关文件,例如: A.merged.bam B.merged.bam。我不确定如何在make中编写这样的规则?
示例makefile
# 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 $@
答案 0 :(得分:2)
你不能用纯粹的模式做到这一点。如何使%_*.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)))
(未经测试......)