2016-03-09 45 views
2

我从来没有写过Makefiles,但我怀疑它会对我的情况有所帮助。我有一些文本文件需要预处理才能提取机器学习功能。该目录结构可能是这样的: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文件,并且运行整个语料库的所有脚本需要几个小时。我需要进行重组,以便在一个文件中进行更改不需要重新处理整个语料库。如果我所建议的并不理想,我欢迎任何有关如何更有效地建立项目的建议。

回答

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) > [email protected] 

运行make-r标志禁用的最高性能的内置规则。

+0

对于其他读者信息,这个makefile中的'$ <'和'$ @'是自动变量:https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html#Automatic - 变量 – reynoldsnlp

+0

参见静态模式规则:http://www.gnu.org/software/make/manual/html_node/Static-Usage.html#Static-Usage – reynoldsnlp