2017-01-17 14 views
3

Мне нужно обработать группу файлов в каталоге, передав их в matlab или скрипт python.Пакетная обработка: GNU-make, Snakemake или что?

Для каждого входного файла FileName.IN в каталоге мне нужно получить выходной файл FileName.OUT.

На самом деле не имеет значения, является ли решение сценарием Python или bash.

Для достижения своей цели я пробую GNU Make (или Python Snakemake), однако я немного застрял на нем. Похоже, я могу сказать, что GNU Make сделать: «Эй, для каждого выходного (целевого) файла FileName.out выполните поиск соответствующего FileName.IN (предварительные требования)».

Однако то, что я хочу сделать, - это как раз наоборот, как указано выше.

  • Является make (или snakemake) правильным выбором?
  • Что еще вы предложите?

Мой makefile код выглядит следующим образом, но это не делает работу (я новичок с GNU сделать):

in_files = *.IN 
out_files = *.out 
$(out_files) : $(in_files) 
    matlab -nosplash -nodesktop -r "a_matlab_function('$<','[email protected]')" 

ответ

5

Я ничего Snakemake не знаю, но в GNU Make вы можете преобразовать in_files, чтобы дать out_files:

in_files = $(wildcard *.IN) 
out_files = $(in_files:.IN=.out) 

Затем вы делаете фиктивную цель, которая зависит от всех выходов:

all: $(out_files) 
.PHONY: all 

И, наконец, правило, чтобы создать один выход с одного входа:

%.out: %.IN 
    matlab -nosplash -nodesktop -r "a_matlab_function('$<','[email protected]')" 
+2

Это * много * лучше, чем скрипт _bash_ выше. Он проверяет возвращаемые значения по мере их поступления. Вы можете запустить его второй раз, и он будет только переконвертировать файлы, которые были изменены. Он будет использовать _all_ ваши процессоры, вы просите _make_ красиво. – bobbogo

+0

Он отлично работает, спасибо большое. Можете ли вы объяснить роль цели PHONY в этом случае? В этом руководстве это не очень полезно. Также я не понимаю, как используются переменные (in_files и out_files): они определены, но не используются в правиле. Каким образом правило может ввести правильное имя файла? – Robyc

+0

Чтобы понять правила шаблона, см. Https://www.gnu.org/software/make/manual/html_node/Pattern-Intro.html. Я не уверен, что вы подразумеваете под руководством, не полезным, но '.PHONY 'в основном говорит о том, что эта цель (здесь,' все') не представляет собой реальный файл на диске, это просто «поддельная» цель, которая может быть использована для создания других целей (через свой список предварительных условий). – MadScientist

2

Я думаю, что вы просто хотите bash цикл:

for f in *.IN; do 
    out=${f%IN}OUT    # Work out name of output file 
    echo IN:"$f"     # Show input file to user 
    echo OUT:"$out"    # Show output file to user 
    matlab <options> "$f" "$out" # Run Matlab 
done 

Так что, если у меня есть эти файлы:

ls *IN 

aThird.IN 
another one.IN 
b.IN 

Я получаю это:

IN:aThird.IN 
OUT:aThird.OUT 
IN:another one.IN 
OUT:another one.OUT 
IN:b.IN 
OUT:b.OUT 

Или, как однострочник:

for f in *.IN; do out=${f%IN}OUT; matlab ... "$f" ... "$out"; done 

Примечание:

не

Хотя ваш вопрос предполагает использование сделать, нет уверен указание, всегда ли вы ожидаете запускать все задания, или иногда некоторые задания не нуждаются в запуске - по-видимому, потому, что выходные файлы уже существуют, и нет необходимости запускать их. Если вы не хотите, чтобы все задания запускались каждый раз, вам, вероятно, будет лучше с сделать.

Кроме того, если Matlab может работать параллельно экземпляров, то GNU Parallel синтаксис хорош для таких вещей, как это:

parallel --dry-run matlab {} {.}.OUT ::: *IN 

Выход

matlab another\ one.IN another\ one.OUT 
matlab aThird.IN aThird.OUT 
matlab b.IN b.OUT 

Здесь --dry-run показывает вам команды, которые будут выполняться, хотя в настоящее время он ничего не запускает.

+2

Вероятно, вы захотите «протестировать» $ в «-nt» $ out », чтобы избежать перекомпоновки выходов, чьи входы не изменились. –

+1

Я бы предложил процитировать разложения, входящие в ваши 'эхо', чтобы просто демонстрировать хорошие практики последовательно. –

+0

Спасибо за ответ. Да, нет необходимости делать задания снова, если входной файл не изменяется. Кстати, я думаю, что это действительно приятно о make-файлах, так это то, что код выглядит довольно чистым. – Robyc

 Смежные вопросы

  • Нет связанных вопросов^_^