Как мне ссылаться на переменные более высоких уровней после фильтров в JQ? - PullRequest
1 голос
/ 17 апреля 2020

Допустим, у меня есть пара тысяч записей Test Kit в списке данных:

[
    {
        "id": "abcde1",
        "data": {
            "type": "COVID19",
            "date": "2020-04-15"
        }
    },
    {
        "id": "hijkl1",
        "data": {
            "type": "COVID20",
            "date": "2020-04-02"
        }
    },
    {
        "id": "asdf1",
        "data": {
            "type": "COVID19",
            "date": "2020-04-16"
        }
    },
    {
        "id": "jkl1",
        "data": {
            "type": "COVID20",
            "date": "2020-04-16"
        }
    }
]

Каждая запись может быть любого "типа". Я хочу отфильтровать по «COVID19» И распечатать «id»:

COVID19 asdf1
COVID19 abcde1

JQ может легко отфильтровать записи, которые «COVID19» для меня:

cat dat.json |jq -r '.[].data |select(.type == "COVID19")'

Но однажды я развернул до .[].data Я больше не могу ссылаться на .[].id.

Как мне ссылаться на ключ / значение более высокого уровня после фильтрации результатов? Есть ли ярлык для объекта root, который напоминает абсолютный путь?

Ответы [ 2 ]

2 голосов
/ 17 апреля 2020

Как ссылаться на переменные более высоких уровней после фильтров в JQ?

Существует множество методов, и ваш выбор, вероятно, будет зависеть от указанного вами класса задач c. в уме.

Один из методов - сохранить интересующий объект в переменной jq, например:

.[]
| .id as $id
| .data
| select(.type == "COVID19")
| [.type, $id]
| join(" ")

Другой метод - использовать paths и getpath .

Еще один вариант - использовать tostream.

1 голос
/ 20 апреля 2020

Для потомков, более простое решение может быть просто изменить доступ с .type на .data.type, поэтому нет необходимости хранить переменные.

.[]
| select(.data.type == "COVID19")
| [.data.type, .id] | join(" ")
...