Как сгруппировать внутри объекта в jq

#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