2016-03-09 91 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