JQ командной строки, объединить массив объектов, мне нужно уменьшить?Или карта?Или же - PullRequest
0 голосов
/ 14 декабря 2018

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

{ "id": "tjh",
"records": [
  {  "name": "number_of_logins",
     "shortname": "nol",
     "value": 3 
   },
   {  "name": "failed_attempts",
      "shortname": "fa",
      "value": 4 
   },
   {  "name": "locations",
      "shortname": "loc",
      "value": 5 
   }
]} 

В формате строк с тысячами записей в файле.Помните об этом, как об ответе, который может работать для одной записи, должен работать для всего файла.

Мне нужно преобразовать его в

ID , name:value,name:value,name:value
ID , name:value,name:value,name:value
ID , name:value,name:value,name:value

Одна строка на каждую запись json вфайл.

Таким образом, в основном одна строка вывода для идентификатора или для каждой записи идентификатора в файле.

Я борюсь со следующим.

Кажется, я могу переформатировать, чтобы получить идентификатор, список значений.Я также могу переформатировать, чтобы получить ID, список имен.

Когда я добавляю оба, я получаю дубликаты.

Вот это на jqplay, https://jqplay.org/s/QTk42jn-a0

Например:

Это близко:

.id , (.records[].name + ":")

Возвращает,

"tjh"
"number_of_logins:"
"failed_attempts:"
"locations:"

Это действительно близко, мне просто нужно добавить значение.

Вот что происходит, когда я добавляю значение:

Фильтр:

.id , (.records[].name + ":" + (.records[].value|tostring))

Вывод:

"tjh"
"number_of_logins:3"
"failed_attempts:3"
"locations:3"
"number_of_logins:4"
"failed_attempts:4"
"locations:4"
"number_of_logins:5"
"failed_attempts:5"
"locations:5"

Это как у меняЯ запускаю полное внешнее соединение как-то.

Я подозреваю, что мне может понадобиться уменьшение или карта.

Любой совет приветствуется, интерактивный URL-адрес веб-сайта для тестирования jq, с моим фрагментом здесь.

https://jqplay.org/s/QTk42jn-a0

Спасибо,

Том

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вы можете использовать строковую интерполяцию с map:

.id + " , " + (.records | map("\(.name):\(.value)") | join(","))

или даже интерполяцией внутри интерполяции:

"\(.id) , \(.records | map("\(.name):\(.value)") | join(","))"
0 голосов
/ 14 декабря 2018

Я не уверен, что понимаю вашу проблему, но это может помочь вам начать.

jq -nr 'inputs
        | [ .id, ( .records[] | .name + ":" + (.value | tostring) ) ]
        | join (",")'

Если вы хотите, чтобы в начале строки был запятый с пробелом, вы могли бы сделать это.

jq -nr 'inputs
        | .id + " , " + 
        ( [ .records[] | .name + ":" + (.value | tostring)  ] | join (",") )'

Я полагаю, что ручная запись в разделе «Итератор значений массива / объекта:. []» Объясняет, почему вы получаете результаты, которые видите.

Удачи!

...