匹配功能的分组结果

时间:2019-05-20 13:46:36

标签: group-by jq

鉴于下面的示例json,我需要做的是查找serialnopool中是否存在在serialno中找到的每个值。如果这是TRUE,那么我需要一种方法来对在serialnopool中找到的serialno值进行分组,以及它们对应的行ID。

serialnopool中存在的serialno值 11079851 的示例输出:

11079851:098、798 等,每个serialno值都将在其新行中继续。 遵循示例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 :(得分:0)

假设“在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值。