групповые результаты соответствия функции - PullRequest
0 голосов
/ 20 мая 2019

Учитывая приведенный ниже пример json, мне нужно найти, существует ли каждое значение, найденное в serialno, в serialnopool. Если это верно, то мне нужен способ, чтобы значения serialno, которые были найдены в serialnopool, сгруппированы вместе с соответствующими им идентификаторами строк.

пример вывода серийно значения 11079851 , существующего в serialnopool:

11079851: 098, 798 и т. Д., Каждое серийно значение будет продолжаться с новой строки. Следует за примером JSON:

 [
      {
        "rowid": "098",
        "serialno": 11079851,
        "serialnopool": 11079851
      },
      {
        "rowid": 110,
        "serialno": 11089385,
        "serialnopool": 25853201
      },
      {
        "rowid": 118,
        "serialno": 11089385,
        "serialnopool": 22412115
      },
      {
        "rowid": 798,
        "serialno": 11079851,
        "serialnopool": 22412115
      },
      {
        "rowid": "",
        "serialno": "",
        "serialnopool": 5423
      },
      {
        "rowid": "",
        "serialno": "",
        "serialnopool": 5421312
      }
    ]

Как этого можно достичь с помощью jq?

1 Ответ

0 голосов
/ 20 мая 2019

Предполагая, что под словом «существует в serialnopool» вы подразумеваете «встречается хотя бы один раз в наборе значений serialnopool», ниже приведено решение при условии, что ваш jq версии 1.5 или выше:

map(.serialnopool) as $snp
| (INDEX( group_by(.serialno)[]; .[0].serialno|tostring)
   | map_values(map(.rowid))) as $dict
| (map(.serialno) | unique[]) as $sn
| if IN($sn; $snp[])
  then "\($sn): " + ($dict[$sn|tostring] | join(", "))
  else empty end

Главной достопримечательностью этого решения является словарь ($ dict), который отображает значения .serialno|tostring на соответствующие значения .rowid.

...