我之前从未写过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
文件,并且运行整个语料库的所有脚本需要几个小时。我需要进行重组,以便一个文件中的更改不需要重新处理整个语料库。如果我建议的内容不理想,我欢迎任何有关如何更有效地设置项目的建议。
答案 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
以禁用内置规则以获得最佳性能。