如何组合(连接)JSON 个包含公共键名称但在 jq 中具有唯一值的对象

How to combine (concatenate) JSON objects which contain a common key name but unique values in jq

使用 jq 命令,我试图将一些数据转换为特定格式

我有一个示例 JSON 集:

我想提取 unique 值 (equip);


只是解决 equip 值作为第一步;我尝试使用样本数据集的一些命令组合(将输出裁剪到每个 k:v 对):

我尝试过的其他方法导致前导逗号,或者递归地连接和字符串化每个对象,但我得出的结论是我从根本上看是错误的。

现在我不确定我是否遗漏了一些简单的东西,或者这是否需要一些复杂的计数和迭代。

注意:我知道从外部切断输出是多么容易 - 有某些原因我想完全在 jq,因为它确实是我想要正确的结构。

您可以将它们分组以确定需要组合哪些 equip 值,然后您可以构建您的字符串。

$ jq -n --arg delim ',' '{
    site: [inputs.site[]]
        | group_by(.uuid)
        | map({
            uuid: .[0].uuid,
            testtype: .[0].testtype,
            name: .[0].name,
            equip: (map(.equip | tojson) | unique | join($delim))
        })
}' input.json

这会产生:(注意:不一定保留项目顺序)

{
  "site": [
    {
      "uuid": "23451fae-a14f-49d1-a096-8f033f69dc80",
      "testtype": "Scheduled",
      "name": "JANE DOE HEAD OFFICE",
      "equip": "\"Unique Item One\",\"Unique Item Two\",\"Unique Item Three\""
    }
  ]
}

如果字符串看起来像 csv 数据并且需要转义,请务必这样做。假设引号需要转义,你可以修改这部分:

map(.equip | gsub("\"";"\"\"") |  tojson)