У меня есть следующий фрагмент JSON:
{
"a": [ 1, "a:111" ],
"b": [ 2, "a:111", "irrelevant" ],
"c": [ 1, "a:222" ],
"d": [ 1, "b:222" ],
"e": [ 2, "b:222", "irrelevant"]
}
, и я хотел бы поменять ключ со вторым значением массива и накапливать ключи с тем же значением, отбрасывая возможные значения после второгоone:
{ "a:111": [ [ 1, "a" ], [ 2, "b" ] ],
"a:222": [ [ 1, "c" ] ],
"b:222": [ [ 1, "d" ], [ 2, "e" ] ]
}
Мое первоначальное решение заключается в следующем:
echo '{
"a": [ 1, "a:111" ],
"b": [ 2, "a:111", "irrelevant" ],
"c": [ 1, "a:222" ],
"d": [ 1, "b:222" ],
"e": [ 2, "b:222", "irrelevant"]
}' \
| jq 'to_entries
| map({(.value[1]|tostring) : [[.value[0], .key]]})
| reduce .[] as $o ({}; reduce ($o|keys)[] as $key (.; .[$key] += $o[$key]))'
Это дает необходимый результат, но, вероятно, не очень устойчиво, трудно читаемо и чрезмерно долго.Я думаю, что есть гораздо более удобочитаемое решение, использующее with_entries , но оно пока ускользнуло от меня.