L oop перезаписывает файл - PullRequest
       0

L oop перезаписывает файл

0 голосов
/ 29 февраля 2020

Мне нужно выполнить команду для тысяч файлов в каталоге. Однако используемой программе нужен файл параметров, в котором указаны имена входов и выходов. Команда выглядит следующим образом:

./program parameters_file.txt

Это строки, которые мне нужно отредактировать в файле settings_file.txt, это строки 1-3. Остальные строки (не показаны) остаются прежними:

 input_file = asd123.OK 
 input_file2 = asd123.TXT    
 outfile = asd123.RESULTS_OUT          

Как видно, все файлы имеют совпадающие имена и меняются только их расширения.

Мне нужно l oop this так что input_file, input_file2 и outfile перезаписываются при каждом перезапуске l oop. Что-то вроде: отредактируйте файл settings_file.txt с первым именем файла, запустите команду для первого файла, отредактируйте файл settings_file.txt со вторым именем файла, запустите команду для второго файла и т. Д. c.

Мысль о:

for f in *.OK;
do
     input_file = $f 
     input_file2 = $f.TXT    
     outfile = $f.RESULTS_OUT 

Но я не знаю, как включить это в команду, и я не могу записать l oop в файл settings_file.txt, потому что он взломает sh программу. Может быть, повторение параметров_file.txt или перезапись с помощью sed?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 29 февраля 2020

Если у вас есть тысячи файлов для обработки, и каждый из них занимает по часу, вы можете использовать GNU Parallel , чтобы выполнить 4, 8 или 16 параллельно и сохранить занятыми все ядра ЦП, для которых вы заплатил интел так красиво ... иначе ты будешь там неделями. Кроме того, если в вашей сети несколько компьютеров, GNU Parallel может также распределять ваши задания и данные по ним, чтобы ускорить процесс.

Итак, при условии, что ваши файлы, требующие обработки, завершатся в *.OK базовый c пример будет следующим:

parallel -k echo {#} {.} ::: ads123.OK qwe987.OK tyu456.OK

Это выведет это:

1 ads123
2 qwe987
3 tyu456

, так что, надеюсь, вы увидите, что {#} - это только последовательно увеличение номера задания и {.} - это имя файла с удаленным расширением.

Хорошо, теперь вы хотите немного обработать файл параметров, прежде чем начинать задание, так что вам лучше будет написать bash функция для каждой работы, в которой вы выполняете предварительную обработку, вот так. Я вызову функцию doit():

doit(){
   jobnum=$1
   name=$2
   paramfile="parameters.$jobnum"
   echo Processing file: $name with parameters in file: $paramfile
}
# Make our function known to jobs started by GNU Parallel
export -f doit

# Now run the jobs
parallel -k doit {#} {.} ::: *.OK

Теперь все, что нам нужно сделать, это изменить doit(), чтобы подготовить ваши параметры, поэтому мы можем сделать:

doit(){
   jobnum=$1
   name=$2
   paramfile="parameters.$jobnum"
   echo Processing file: $name with parameters in file: $paramfile
   # Following code supplied by @poshi
   echo "input_file = $name"          >  "$paramfile
   echo "input_file2 = $name.TXT"     >> "$paramfile"
   echo "outfile = $name.RESULTS_OUT" >> "$paramfile"
   # Add/copy/incorporate the rest of the parameters as you wish
   echo program "$paramfile"
}
2 голосов
/ 29 февраля 2020

Я думаю, что-то вроде этого достигнет того, что вы хотите:

#!/bin/bash

for file in *.OK; do
    sed -i \
    -e "s/input_file =.*/input_file = ${file}/" \ 
    -e "s/input_file2.*/input_file2 = ${file%.OK}.TXT/" \
    -e "s/outfile.*/outfile = ${file%.OK}.RESULTS_OUT/" \
    parameters_file.txt

    ./program parameters_file.txt 
done
2 голосов
/ 29 февраля 2020

Используйте printf для замены процесса, не беспокойтесь о замене строк в вашем parameters_file.txt.

for f in *.OK; do
  prog <(
    printf 'input_file = %s\ninput_file2 = %s\noutfile = %s\n' "${f%OK}"{OK,TXT,RESULTS_OUT}
    tail -n +4 parameters_file.txt
  )
done
2 голосов
/ 29 февраля 2020

Выполните все действия oop, которые создали файл входных параметров, и запустите программу:

for f in *.OK;
do
    echo "input_file = $f" > parameters
    "input_file2 = $f.TXT" >> parameters
    "outfile = $f.RESULTS_OUT" >> parameters
    # Add/copy/incorporate the rest of the parameters as you wish

    ./program parameters
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...