Вот некоторые дополнительные разъяснения
Для ввода объекта {"key1":1, "key2":2, "key3":3}
Я хотел бы удалить все ключи, которые не входят в набор требуемых ключей ["key1","key3","key4"]
jq -n --argjson desired_keys '["key1","key3","key4"]' \
--argjson input '{"key1":1, "key2":2, "key3":3}' \
' $input
| with_entries(
select(
.key == ($desired_keys[])
)
)'
with_entries
преобразует {"key1":1, "key2":2, "key3":3}
в следующий массив пары значений ключа s и отображает инструкцию select в массиве, а затем возвращает результирующий массив обратно в объект.
Вот внутренний объект в заявлении with_entries
.
[
{
"key": "key1",
"value": 1
},
{
"key": "key2",
"value": 2
},
{
"key": "key3",
"value": 3
}
]
мы можем выбрать ключи из этого массива, соответствующие нашим критериям.
Здесь происходит волшебство ... вот посмотрите, что происходит в середине этой команды. Следующая команда принимает расширенный массив значений и превращает их в список объектов, которые мы можем выбрать.
jq -cn '{"key":"key1","value":1}, {"key":"key2","value":2}, {"key":"key3","value":3}
| select(.key == ("key1", "key3", "key4"))'
Это даст следующий результат
{"key":"key1","value":1}
{"key":"key3","value":3}
с помощью команды записи могут быть немного сложнее, но его легко запомнить, что требуется фильтр и определяется следующим образом
def with_entries(f): to_entries|map(f)|from_entries;
Это то же самое, что и
def with_entries(f): [to_entries[] | f] | from_entries;
Другая часть вопроса, который смущает людей, состоит из нескольких совпадений в правой части поля ==
Рассмотрим следующую команду. Мы видим, что выход представляет собой внешнее производство всех левых списков и списков правой руки.
Если этот предикат находится в операторе select, мы сохраняем ввод, когда предикат является истинным. Обратите внимание, что вы также можете дублировать входные данные.
jq -cn '1,2,3| select(. == (1,1,3))'
1
1
3
Из документации, из которой я мог бы использовать(), в элементе rhs оператора ==, можно было выбрать 'select (.key == (" 1 "," 3 "," 4 ")) ' – Jon