Объединение интеллектуальных диапазонов Awk и jq

#awk #jq

#awk #jq

Вопрос:

У меня есть файл с несколькими строками в следующем json формате, который я хочу передать по каналу jq , чтобы извлечь несколько полей.

Формат является,

 {"userData":[{"user":{"loginName":"TEST",....]}.

{"userData":[{"user":{"loginName":"TEST1",....]}.
  

.... представляет «некоторые» json данные.

Я могу извлечь строки с помощью awk '/{"userData"/{p=1}; p; /}./{p=0};' , которые, кажется, печатаются просто отлично.

Трудность, с которой я сталкиваюсь, заключается в том, чтобы выполнить jq для каждой из строк и извлечь json поля. Как этого добиться с помощью одной awk команды?

Комментарии:

1. Существует ли буквально точка в конце каждого объекта (и строки)?

2. @JeffMercado есть. Чтобы дать вам некоторую предысторию, это некоторые данные документа из API-интерфейсов elastic search.

Ответ №1:

Содержимое этого файла не является чисто json, если эти точки действительно присутствуют в конце строк. Если каждая строка в этом файле представляет собой отдельный объект json, за которым сразу следует точка, вы можете прочитать файл в формате raw (который передает в качестве входных данных каждую строку в файле в виде строки), удалить точку, затем проанализировать json и обработать как обычно.

Например, удаление всех имен входа пользователя:

 $ jq -R '.[:-1] | fromjson | .userData[].user.loginName' input.txt