У меня есть файл журнала с именем log.json
, который отформатирован так:
{"msg": "Service starting up!"}
{"msg": "Running a job!"}
{"msg": "Error detected!"}
И еще один файл с именем messages.json
, который выглядит так:
{"msg": "Service starting up!", "out": "The service has started"}
{"msg": "Error detected!", "out": "Uh oh, there was an error!"}
{"msg": "Service stopped", "out": "The service has stopped"}
Я пытаюсь написать функцию, используя jq
, которая читает оба файла, и всякий раз, когда он находит msg
в log.json
, который совпадает с msg
в messages.json
, выведите значение out
в соответствующей строке в messages.json
. Итак, в этом случае я надеюсь получить это как вывод:
"The service has started"
"Uh oh, there was an error!"
Самое близкое, что мне удалось сделать, это следующее:
jq --argfile a log.json --argfile b messages.json -n 'if ($a[].msg == $b[].msg) then $b[].out else empty end'
Это успешно выполняет все сравнения, которые я надеюсь сделать. Однако вместо того, чтобы печатать конкретный out
, который я ищу, вместо этого он печатает каждый out
всякий раз, когда оператор if возвращает true (что имеет смысл. $b[].out
никогда не был переопределен, и запрашивает каждый из них). Итак, это утверждение выводит:
"The service has started"
"Uh oh, there was an error!"
"The service has stopped"
"The service has started"
"Uh oh, there was an error!"
"The service has stopped"
Итак, на данный момент мне нужен какой-то способ попросить $b[current_index].out
и просто напечатать это. Есть ли способ для меня сделать это (или совершенно отдельный подход, который я могу использовать)?