JQ с вложенным JSON - PullRequest
       20

JQ с вложенным JSON

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

Здравствуйте, я новичок в JQ и инструментах командной строки в целом, так что я действительно потерян с этим.У меня есть файл JSON в виде:

{
    "Z": {
        "00": [{
                "e": "A000"
            }, {
                "e": "A020"
            }
        ],
        "01": [{
                "e": "A102"
            }, {
                "e": "C027"
            }
        ]
    },
    "X": {
        "00": [{
                "e": "P002"
            }, {
                "e": "T027"
            }
        ],
        "01": [{
                "e": "A003"
            }, {
                "e": "A020"
            }
        ]
    }
}

, где каждый объект представляет собой семизначный буквенно-цифровой код.

Мне нужна команда для вывода каждого кода, разделенногосимвол новой строки, например, такой:

Z00A000
Z00A020
Z01A102
Z01C027
X00P002
X00T027
X01A003
X01A020

Формат JSON всегда будет одинаковым, хотя имена «Z» и «X», а также вспомогательные имена «00», «01» и т. д. могут измениться, поэтомуони не могут быть жестко закодированы.

Как уже говорилось, я новичок в этом, и самое близкое, что я получил, это

jq '.[] | .[] | .[] | .e'

, который дал мне список из последних четырех символов кодов.

Если честно, я полностью потерян, поэтому любая помощь будет высоко ценится.Спасибо за чтение.

1 Ответ

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

Вот решение, основанное на однородности формата.

Во-первых, давайте определим вспомогательную функцию, которая обрабатывает объекты JSON, значения которых являются массивами объектов вида {"e": _}:

def combine:
  keys_unsorted[] as $k
  | $k + (.[$k][]|.e) ;

Теперь решение можно записать всего в две строки:

keys_unsorted[] as $k
| $k + (.[$k]|combine)

Использование параметра командной строки -r приведет к тому, что строки будут выводиться без кавычек.

Другая стратегия

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

paths as $p
| getpath($p) as $v
| select($v | type == "string")
| $p
| map(select(type=="string"))
| map(select(. != "e"))
| . + [$v]
| join("")
...