В дальнейшем мы будем предполагать, что ключ $ содержит интересующий ключ.
Ключ к эффективности здесь заключается в том, чтобы завершить обработку потока, созданного параметром --stream
, для завершения обработки $.ключ ключ.Для этого мы можем определить вспомогательную функцию следующим образом.Обратите внимание, что он использует inputs
, и, следовательно, при вызове jq должен использоваться параметр командной строки -n.
# break out early
def filter($key):
label $out
| foreach inputs as $in ( null;
if . == null
then if $in[0][0] == $key then $in
else empty
end
elif $in[0][0] != $key then break $out
else $in
end;
select(length==2) );
Восстановление желаемой пары ключ-значение теперь можно выполнить следующим образом:
reduce filter($key) as $in ({};
setpath($in[0]; $in[1]) )
Пример input.json
{
"key1": {
"subtree1": {
"a": {"aa":[1,2,3]}
}
},
"key2": {
"subtree2": {
"b1": {"bb":[11,12,13]},
"b2": {"bb":[11,12,13]}
}
},
"key3": {
"subtree3": {
"c": {"cc":[21,22,23]}
}
}
}
Иллюстрация
jq -n -c --arg key "key2" --stream -f extract.jq input.json
Выход
{"key2":{"subtree2":{"b1":{"bb":[11,12,13]},"b2":{"bb":[11,12,13]}}}}