如何去规范化这个 json 结构
how to denormalise this json structure
我有一份 json 格式的备份概览,使用 pgbackrest 生成。为简单起见,我删除了很多杂乱的内容,因此主要结构得以保留。该列表可以包含多个备份结构,为了简单起见,我在这里减少到只有 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 从中生成一个 simpeler 格式,直到现在都没有运气。
我希望看到的是 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"
}
]
}
]
其中名称被多余地添加到列表中。如何使用 jq 将显示的输入转换为请求的输出?最后我只想从数据中生成一个简单的 csv。即使使用
的简化结构
'.[].backup[].name + ":" + .[].backup[].type'
我得到笛卡尔积:
"dbname1:full"
"dbname1:full"
"dbname1:incr"
"dbname1:incr"
如何解决?
因此,对于顶级数组中的每个对象,您希望将 .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
'
我有一份 json 格式的备份概览,使用 pgbackrest 生成。为简单起见,我删除了很多杂乱的内容,因此主要结构得以保留。该列表可以包含多个备份结构,为了简单起见,我在这里减少到只有 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 从中生成一个 simpeler 格式,直到现在都没有运气。
我希望看到的是 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"
}
]
}
]
其中名称被多余地添加到列表中。如何使用 jq 将显示的输入转换为请求的输出?最后我只想从数据中生成一个简单的 csv。即使使用
的简化结构'.[].backup[].name + ":" + .[].backup[].type'
我得到笛卡尔积:
"dbname1:full"
"dbname1:full"
"dbname1:incr"
"dbname1:incr"
如何解决?
因此,对于顶级数组中的每个对象,您希望将 .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
'