大量文件的 Makefile
Makefile for a LARGE number of files
我以前从未编写过 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
文件,并且 运行 整个语料库的所有脚本都需要一个几个小时。我需要重组,这样一个文件的变化就不需要重新处理整个语料库。如果我的建议不理想,我欢迎任何有关如何更有效地设置项目的建议。
这是完成此操作的一种方法
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
标志禁用内置规则以获得最佳性能。
我以前从未编写过 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
文件,并且 运行 整个语料库的所有脚本都需要一个几个小时。我需要重组,这样一个文件的变化就不需要重新处理整个语料库。如果我的建议不理想,我欢迎任何有关如何更有效地设置项目的建议。
这是完成此操作的一种方法
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
标志禁用内置规则以获得最佳性能。