0

我有一个使用 pgbackrest 生成的 json 格式的备份概述。为简单起见,我删除了很多杂物,因此保留了主要结构。该列表可以包含多个备份结构,为简单起见,我在此处将其缩减为 1。

[
  {
    "backup": [
      {
        "archive": {
          "start": "000000090000000200000075",
          "stop": "000000090000000200000075"
        },
        "info": {
          "size": 1200934840
        },
        "label": "20220103-122051F",
        "type": "full"
      },
      {
        "archive": {
          "start": "00000009000000020000007D",
          "stop": "00000009000000020000007D"
        },
        "info": {
          "size": 1168586300
        },
        "label": "20220103-153304F_20220104-081304I",
        "type": "incr"
      }
    ],
    "name": "dbname1"
  }
]

使用 jq 我试图从中生成一个简单的格式,直到现在没有任何运气。

我希望看到的是backup.archive、backup.info、backup.label、backup.type、名称组合在一个简单的结构中,而不需要进入笛卡尔积。我很高兴得到以下输出:

[
  {
    "backup": [
      {
        "archive": {
          "start": "000000090000000200000075",
          "stop": "000000090000000200000075"
        },
        "name": "dbname1",
        "info": {
          "size": 1200934840
        },
        "label": "20220103-122051F",
        "type": "full"
      },
      {
        "archive": {
          "start": "00000009000000020000007D",
          "stop": "00000009000000020000007D"
        },
        "name": "dbname1",
        "info": {
          "size": 1168586300
        },
        "label": "20220103-153304F_20220104-081304I",
        "type": "incr"
      }
    ]
  }
]

其中 name 被冗余添加到列表中。如何使用 jq 将显示的输入转换为请求的输出?最后,我只想从数据中生成一个简单的 csv。即使使用简化的结构

'.[].backup[].name + ":" + .[].backup[].type'

我得到一个笛卡尔积:

"dbname1:full"
"dbname1:full"
"dbname1:incr"
"dbname1:incr"

如何解决?

4

1 回答 1

1

因此,对于顶层数组中的每个对象,您都希望将其拉.name入其.backup数组的每个元素中,对吧?然后尝试

jq 'map(.backup[] += {name} | del(.name))'

演示

然后,使用 jq 生成 CSV 输出很容易:有一个名为 @csv 的内置函数将数组转换为带有引号(如果它们是字符串)并用逗号分隔的值的字符串。因此,您需要做的就是迭代地将所需的值组合到数组中。此时,.name不再需要删除,因为无论如何我们都在拼凑 CSV 输出的数组。我们将 -r 标志提供给 jq 以便输出原始文本而不是 JSON。

jq -r '.[]
  | .backup[] + {name}
  | [(.archive | .start, .stop), .name, .info.size, .label, .type]
  | @csv
'

演示

于 2022-01-05T13:53:42.340 回答