Используйте jq для замены строковых значений массива файла txt из словаря - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть словарь, который выглядит следующим образом:

{
  "uid": "d6fc3e2b-0001a",
  "name": "ABC Mgmt",
  "type": "host"
}
{
  "uid": "d6fc3e2b-0002a",
  "name": "Server XYZ",
  "type": "group"
}
{
  "uid": "d6fc3e2b-0003a",
  "name": "NTP Primary",
  "type": "host"
}
{
  "uid": "d6fc3e2b-0004a",
  "name": "H-10.10.10.10",
  "type": "host"
}

Затем у меня есть текстовый файл:

"d6fc3e2b-0001a"
"d6fc3e2b-0001a","d6fc3e2b-0002a","d6fc3e2b-0003a"
"d6fc3e2b-0004a"

Ожидаемый результат:

"ABC Mgmt"
"ABC Mgmt","Server XYZ","NTP Primary"
"H-10.10.10.10"

I Есть некоторые проблемы, чтобы сделать JQ, используя массив, который не json формат. Я пробовал разные решения, которые нашел, но ни одно из них не сработало. Я довольно новичок в написании сценариев, мне нужна помощь.

input=file.txt
while IFS= read -r line
do
{
value=$(jq -r --arg line "$line" \
  'from_entries | .[($line | split(","))[]]' \
  dictionary.json)
echo $name
}
done < "$input"

1 Ответ

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

В следующем решении файл словаря читается с использованием параметра командной строки --slurpfile, а строки «текста» читаются с использованием inputs в сочетании с параметром командной строки -n. Параметр командной строки -r используется вместе с фильтром @csv для получения желаемого результата.

Вызов

jq -n -R -r --slurpfile dict stream.json -f program.jq stream.txt

program.jq

(INDEX($dict[]; .uid) | map_values(.name)) as $d
| inputs
| split(",")
| map(fromjson)
| map($d[.])
| @csv

Caveat

В приведенном выше предположении предполагается, что значения в кавычках в файле stream.txt сами по себе не содержат запятых.

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

Решение проблемы, описанной в комментарий

Invocation

< original.json jq -r --slurpfile dict stream.json -f program.jq

program.jq

 (INDEX($dict[]; .uid) | map_values(.name)) as $d
 | .source
 | map($d[.])
 | @csv
...