document有数组,JQ过滤器使用group_by如何解决JQ处理为多个字典?

How to solve JQ processing as multiple dictionaries if document has an array and JQ filter uses group_by?

我有以下 JSON 文档

[
  {
    "id": 6,
    "description": "Component 1",
    "due": "20211122T183000Z",
    "entry": "20211119T181735Z",
    "modified": "20211119T181735Z",
    "project": "product1",
    "status": "pending",
    "uuid": "55bf0497-208c-492a-8f76-bb692d48afaa",
    "tags": [
      "abc",
      "123"
    ],
    "urgency": 13.9699
  },
  {
    "id": 10,
    "description": "Component 2",
    "due": "20211129T183000Z",
    "entry": "20211130T045620Z",
    "modified": "20211130T045620Z",
    "project": "product2",
    "status": "pending",
    "uuid": "d57eb8f7-e5ec-497c-ac47-f1cf34b005db",
    "tags": [
      "foo",
      "bar"
    ],
    "urgency": 14.0151
  },
  {
    "id": 11,
    "description": "Component 3",
    "due": "20211202T183000Z",
    "entry": "20211130T121529Z",
    "completed": "20211130T123915Z",
    "project": "product3",
    "status": "pending",
    "uuid": "9f15e6a4-5cef-4b0f-915b-fc916ab152c7",
    "tags": [
      "xyz",
      "676"
    ],
    "urgency": 14.0096
  },
  {
    "id": 12,
    "description": "Component 4",
    "due": "20211202T183000Z",
    "entry": "20211130T122537Z",
    "pending": "20211130T122537Z",
    "project": "product1",
    "status": "pending",
    "uuid": "91c9ec76-42a7-4ebc-9649-b3a12027feb1",
    "tags": [
      "def"
    ],
    "urgency": 13.9096
  }
]

我在下面写了JQ过滤器来解析JSON,预期的输出不是生成多个字典。

group_by(.project,.status)  
         | .[] 
         | { project: .[0].project , status: .[0].status , 
             description: [{"\(.[].description)" : (.[].tags | join(";"))}] }

应用过滤器后,由于 tags 数组

,我使用 multiple dictionaries 得到以下输出
{
  "project": "product1",
  "status": "pending",
  "description": [
    {
      "Component 1": "abc;123"
    },
    {
      "Component 1": "def"
    },
    {
      "Component 4": "abc;123"
    },
    {
      "Component 4": "def"
    }
  ]
}
{
  "project": "product2",
  "status": "completed",
  "description": [
    {
      "Component 2": "foo;bar"
    }
  ]
}
{
  "project": "product3",
  "status": "completed",
  "description": [
    {
      "Component 3": "xyz;676"
    }
  ]
}

我期望的输出没有 multiple dictionaries,如下所示

{
  "project": "product1",
  "status": "pending",
  "description": [
    {
      "Component 1": "abc;123"
    },
    {
      "Component 4": "def"
    }
  ]
}
{
  "project": "product2",
  "status": "completed",
  "description": [
    {
      "Component 2": "foo;bar"
    }
  ]
}
{
  "project": "product3",
  "status": "completed",
  "description": [
    {
      "Component 3": "xyz;676"
    }
  ]
}

如何使用 JQ 生成上述预期的输出?


要将 .description.tags 合并在一起,请使用

jq '.[] | del(.description, .tags) + ({(.description): .tags | join(";")})'

Demo

要也按 .project 分组,只考虑 .project.status 和上面带有 .description.tags 的数组,go

jq '
  group_by(.project)[]
  | (first | {project, status})
  + {description: map({(.description): .tags | join(";")})}
'

Demo

一个与您类似的选项是

jq 'group_by(.project)[] 
             | { project: .[0].project, status:.[0].status, "description": [.[] 
             | { (.description) : .tags|join(";") } ] }'

Demo