Более короткая конструкция для фильтрации ключей объекта в данных json с использованием jq - PullRequest
0 голосов
/ 10 января 2019

Мои данные - это список объектов с множеством ключей. Чтобы изучить данные, я только хочу взглянуть на ограниченный набор ключей.

input:
[
    {
        "field_1":123,
        "field_2":123,
        "field_3":123,
        "field_4":123,
        "field_5":123,
        ...and so on...
    },
    {
        "field_1":123,
        "field_2":123,
        "field_3":123,
        "field_4":123,
        "field_5":123,
        ...and so on...
    },
    ...many objects like this...
]
Я хочу такой результат, как:
[
    {
        "field_1":123,
        "field_2":123,
    },
    {
        "field_1":123,
        "field_2":123,
    },
    ...all objects like this...
]

Я знаю, что могу сделать:

jq '.[] | {field_1:.field_1,field_2:.field_2}'

Но он становится повторяющимся для исследования данных в командной строке. Доступна ли функция быстрого доступа, например:

jq '.[] | filter_keys("field_1","field_2")'

Ответы [ 2 ]

0 голосов
/ 10 января 2019

В зависимости от вашей ситуации, вы можете включить только те поля, которые существуют в объектах, поэтому вам придется выполнить некоторую фильтрацию пути. Затем вы можете просто передать список полей для включения. Или даже сделать фильтрацию на основе шаблонов.

$ jq --arg fields 'field_1,field_2' '
map(with_entries(select(. as {$key} | any($fields|split(",")[]; $key == .))))
' input.json

И, как и в случае с любым другим фильтром, их можно превратить в функции и сохранить в файле ~/.jq, чтобы они были доступны по всему миру, например:

def filter_keys($keys):
    with_entries(select(. as {$key} | any($keys[]; $key == .)));

И используя его:

$ jq --arg fields 'field_1,field_2' 'map(filter_keys($fields|split(",")))'
0 голосов
/ 10 января 2019

Для этого есть условное обозначение:

jq '.[] | {field_1,field_2}'
...