【问题标题】:Merge related files in a makefile using pattern rules使用模式规则在生成文件中合并相关文件
【发布时间】:2015-02-18 18:39:17
【问题描述】:

我正在使用 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 $@

【问题讨论】:

    标签: makefile bioinformatics


    【解决方案1】:

    你不能用纯模式做到这一点。如何使%_*.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)))
    

    (未测试...)

    【讨论】:

      猜你喜欢
      • 2012-02-07
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多