#linux #bash #jq
Вопрос:
У меня есть этот объект JSON
{ "id_1": { "day_1": { "loc_sec": 886, "int_sec": null } }, "id_1": { "day_2": { "loc_sec": 575, "int_sec": null } }, "id_2": { "day_1": { "loc_sec": 140, "int_sec": null } }, "id_2": { "day_2": { "loc_sec": 138, "int_sec": null } } }
И я хочу получить такой результат
{ "id_1": { "day_1": { "loc_sec": 886, "int_sec": null }, "day_2": { "loc_sec": 575, "int_sec": null } }, "id_2": { "day_1": { "loc_sec": 140, "int_sec": null }, "day_2": { "loc_sec": 138, "int_sec": null } } }
Как мне добиться этого с помощью скрипта bash и jq? Это похоже на группу по функциональности, но я не могу понять это.
Комментарии:
1. Ваш JSON синтаксически корректен, но фактически бесполезен из-за дублированных ключей, поэтому, хотя эта проблема может быть решена с помощью jq (с помощью опции —stream), более важный вопрос заключается в том, связана ли ваша фактическая проблема с таким сомнительным JSON.
Ответ №1:
Вот решение, использующее опцию jq —stream:
jq -n --stream ' def stream: foreach ((inputs | select(length==2)), null) as $kv (null; if $kv == null then .emit = .value else .emit = null | $kv[0][0] as $k | if .k and ($k != .k) then .emit = .value | .value = null else . end | .value |= setpath($kv[0]; $kv[1]) | .k = $k end; select(.emit).emit); [stream] | add ' input.json