Как часть процесса CI \ CD в моей команде, я хочу сгенерировать сценарий динамических команд из файла, содержащего пути к некоторым ресурсам.
Файл paths.txt содержит пути, разделенные новыми строками. Для каждой строки в этом файле должна быть сгенерирована команда, если она не начинается с "JarPath /..."
пример:
JarPath/DontTouchMe.jar
path/to/some/resource/View/PutMeInScript.msgflow
path/to/some/resource/Control/MeAlso.map
Файл mapping.txt содержит пары ключ-значение. ключ - это фраза, которую нужно сопоставить с путем из paths.txt, и ее значение требуется для сгенерированной команды.
пример:
View viewEG.bar
Control controlEG.bar
Строки в paths.txt не отсортированы, и некоторые пути могут соответствовать одному значению в mapping.txt.
Следует учитывать только первое совпадение в файле mapping.txt, которое соответствует первому возможному анализу пути. Меня не волнует, совпадает ли более поздняя строка в отображении, и не совпадает ли более поздний каталог в пути с другой строкой.
Соответствующий анализ на пути не находится в фиксированном месте (например, после 4-го "/")
Окончательный результат в файле скрипта должен быть:
mqsicreatebar -data ./ -b viewEG.bar -o /path/to/some/resource/View/PutMeInScript.msgflow
mqsicreatebar -data ./ -b controlEG.bar -o /path/to/some/resource/Control/MeAlso.map
Так как командная строка берет данные из двух источников (paths.txt и пары значений из mapping.txt), я не мог ни заключить их в одну команду awk, ни передать их в одну строку bash. Я написал:
pathVar="paths.txt"
touch deltaFile.txt
while IFS= read -r line
do
awk -v var=$line" 'var ~ $1 && var !~ /^JarPath/ {print $2, " ", var ;exit}' mapping.txt >> deltaFile.txt
done < "$pathVar"
IFS=$'\n'
awk '{print "mqsicreatebar -data ./ -b", $1, "-o", $2 }' deltaFile.txt > script.sh
Ну, это работает, но есть ли лучший способ сделать это?