Обменять ключ и значение и накапливать значения - PullRequest
0 голосов
/ 13 июня 2018

У меня есть следующий фрагмент 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 , но оно пока ускользнуло от меня.

1 Ответ

0 голосов
/ 13 июня 2018

Short jq подход:

jq 'reduce to_entries[] as $o ({};
    .[$o.value[1]] += [[$o.value[0], $o.key]])' input.json

Выход:

{
  "a:111": [
    [
      1,
      "a"
    ],
    [
      2,
      "b"
    ]
  ],
  "a:222": [
    [
      1,
      "c"
    ]
  ],
  "b:222": [
    [
      1,
      "d"
    ],
    [
      2,
      "e"
    ]
  ]
}
...