Возврат нескольких блоков в JQ с форматированием - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть ниже JSON в качестве ввода:

[
    {
        "ENVIRONMENT": [
            "sit"
        ], 
        "Usage": [], 
        "id": "i-098a99bd2bd0ac86b", 
        "Name": [
            "instance1"
        ]
    }, 
    {
        "ENVIRONMENT": [
            "uat"
        ], 
        "Usage": [
            "testing"
        ], 
        "id": "i-0b210876db6d028f3", 
        "Name": [
            "instance2"
        ]
    }
]

Я могу использовать jq '.[] | [.id, .ENVIRONMENT[], .Usage[], .Name[]]', чтобы получить следующее:

[
  "i-098a99bd2bd0ac86b",
  "sit",
  "instance1"
]
[
  "i-0b210876db6d028f3",
  "uat",
  "testing",
  "instance2"
]

Или я мог бы использовать jq '.[] | {id: .id, env: .ENVIRONMENT[], usage: .Usage[], name: .Name[]}' для получения следующего (он возвращает только один из экземпляров):

{
  "id": "i-0b210876db6d028f3",
  "env": "uat",
  "usage": "testing",
  "name": "instance2"
}

Есть ли способ получить форматирование второго метода, но вернуть все экземпляры, которые дает мне первый метод? Я полагаю, что для тега, который не существует ни в одном из экземпляров, использование будет пустым или пустым.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

В общем, нужно быть осторожным с использованием. [] Несколько раз, как это делал OP. Если вам просто нужен первый элемент в каждом массиве, вы можете использовать .[0] следующим образом:

.[]
| {id, env: .ENVIRONMENT[0], usage: .Usage[0], name: .Name[0]}

(Этот подход хорошо обрабатывает случай, когда некоторые массивы пусты).

Если (например) массив .ENVIRONMENT может содержать более одного элемента, вы можете рассмотреть другой вариант, например:

.[]
| range(0; .ENVIRONMENT|length) as $i
| {id, env: .ENVIRONMENT[$i], usage: .Usage[$i], name: .Name[$i]}
0 голосов
/ 09 ноября 2018

Вы можете попробовать этот фильтр JQ:

jq '.[]|{id,env:.ENVIRONMENT[],usage:(.Usage[]//null),name:.Name[]}' file

, который почти совпадает с вами, за исключением .Usage[]//null, который дает Usage или, если его нет * null.

Обратите внимание, что ваша первая попытка такая же, как:

jq '.[]|flatten' 

(хотя требуется jq 1.5)

...