Использование awk для манипулирования данными из двух источников - PullRequest
1 голос
/ 14 мая 2019

Как часть процесса 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

Ну, это работает, но есть ли лучший способ сделать это?

1 Ответ

3 голосов
/ 14 мая 2019

Учитывая ваш комментарий ниже, что Only the first match in the mapping.txt file that matches the first possible parse in the path should be considered. The key dir can appear anywhere это то, что вам нужно:

$ cat tst.awk
NR==FNR {
    keys[++numKeys] = $1
    map[$1] = $2
    next
}
!/^JarPath/ {
    numDirs = split($0,dirs,"/")
    val = ""
    for (dirNr=1; (dirNr<=numDirs) && (val==""); dirNr++) {
        dir = dirs[dirNr]
        for (keyNr=1; (keyNr<=numKeys) && (val==""); keyNr++) {
            key = keys[keyNr]
            if (dir == key) {
                val = map[dir]
            }
        }
    }
    printf "mqsicreatebar -data ./ -b \047%s\047 -o \047%s\047\n", val, $0
}

$ awk -f tst.awk mapping.txt paths.txt
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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...