Объедините несколько массивов JSON в одном файле в один массив JSON, используя JQ - PullRequest
0 голосов
/ 04 октября 2019

У меня есть файл с несколькими отдельными массивами JSON, которые я хочу объединить (и удалить пустые массивы) в один массив JSON

Ввод

[]
[]
[
    [
        [
            "asdfsdfsdf",
            "CCsdfnceR1",
            "running",
            "us-east-1a",
            "34.6X.7X.2X",
            "10.75.170.118"
        ]
    ]
]
[]
[]
[
    [
        [
            "tyutyut",
            "CENTOS-BASE",
            "stopped",
            "us-west-2b",
            null,
            "10.87.159.249"
        ]
    ],
    [
        [
            "tyutyut",
            "dfgdfg-TEST",
            "stopped",
            "us-west-2b",
            "54.2X.8.X8",
            "10.87.159.247"
        ]
    ]
]

Требуемый вывод

[
    [
        "asdfsdfsdf",
        "CCsdfnceR1",
        "running",
        "us-east-1a",
        "34.6X.7X.2X",
        "10.75.170.118"
    ],
    [
        "tyutyut",
        "CENTOS-BASE",
        "stopped",
        "us-west-2b",
        null,
        "10.87.159.249"
    ],
    [
        "tyutyut",
        "dfgdfg-TEST",
        "stopped",
        "us-west-2b",
        "54.2X.8.X8",
        "10.87.159.247"
    ]
]

У меня есть файл с несколькими отдельными массивами JSON, которые я хочу объединить (и удалить пустые массивы) в один массив JSON

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Это выбирает только непустые массивы, ни один из элементов которых не является массивом, и помещает их в массив:

jq -n '[ inputs | .. | select(type=="array" and .!=[] and all(.[]; type!="array")) ]' file
0 голосов
/ 04 октября 2019

Точные требования для меня не слишком понятны, но использование следующего def дает ожидаемый результат и может представлять интерес, поскольку он рекурсивный:

def peel:
  if type == "array"
  then if length == 0 then empty
       elif length == 1 and (.[0] | type) == "array" then .[0] | peel
       elif all(.[]; type=="array") then .[] | peel
       else [.[] | peel]
       end
  else .
  end;

С этим def, иследующая «основная» программа:

[inputs | peel]

вызов jq с использованием опции -n дает ожидаемый результат.

...