Makefile用于大量文件

时间:2016-03-09 23:58:47

标签: makefile corpus tagged-corpus

我之前从未写过Makefile,但我怀疑它会对我的情况有所帮助。我有一组文本文件,我需要预处理以提取机器学习的功能。目录结构可能是这样的:

/
+---Makefile
+---/corpus
|   +-- a.txt
|   +-- b.txt
|   +-- ...
|
+---/wordcounts
|   +-- a.wordcount
|   +-- b.wordcount
|   +-- ...
|
+---/lettercounts
|   +-- a.lettercount
|   +-- b.lettercount
|   +-- ...
|
...

/wordcounts/lettercounts中的文件是根据/corpus中的文件生成的。对于文件a.txt,我可以像这样编写make个依赖项:

all: wordcounts/a.wordcount lettercounts/a.lettercount

wordcounts/a.wordcount: corpus/a.txt
    cat corpus/a.txt | wc -w > wordcounts/a.wordcount

lettercounts/a.lettercount: corpus/a.txt
    cat corpus/a.txt | wc -m > lettercounts/a.lettercount

但是,\corpus中有数千个文件,这个Makefile会变得非常长。我想写一个Makefile,它将适应\corpus中的任何文件。我的想法是,无论我放入/corpus多少个文件,Makefile都会自动生成所有其他文件。我怎样才能做到这一点?这是automake的用途吗?

背景目前,我使用大量脚本生成大型csv文件,并且运行整个语料库的所有脚本需要几个小时。我需要进行重组,以便一个文件中的更改不需要重新处理整个语料库。如果我建议的内容不理想,我欢迎任何有关如何更有效地设置项目的建议。

1 个答案:

答案 0 :(得分:2)

这是实现此目的的一种方法

corpora      := $(wildcard corpus/*.txt)
wordcounts   := $(corpora:corpus/%.txt=wordcounts/%.wordcount)
lettercounts := $(corpora:corpus/%.txt=lettercounts/%.lettercount)

.PHONY: all
all: $(wordcounts) $(lettercounts)

$(wordcounts): wcflags += -w
$(wordcounts): wordcounts/%.wordcount: corpus/%.txt

$(lettercounts): wcflags += -m
$(lettercounts): lettercounts/%.lettercount: corpus/%.txt

$(wordcounts) $(lettercounts):
    cat $< | wc $(wcflags) > $@

使用make标志运行-r以禁用内置规则以获得最佳性能。