jq从json副本中创建唯一的密钥



我正在尝试转换一个json文件,在提取了我需要的东西之后,它看起来是这样的:

{
"title": "title 1",
"description": "desc 1",
"message": "msg 1",
"region": "region 1",
"resource": "resource 1"
}
{
"title": "title 1",
"description": "desc 1",
"message": "msg 1",
"region": "region 2",
"resource": "resource 2"
}

我想把它转换成

{
"title": "title 1",
"description": "desc 1",
"message": "msg 1",
"data": [
{"region 1":"resource 1"},
{"region 2":"resource 2"}
]
}

我的想法是转换json,使重复的标题、描述和消息唯一(从而消除重复(,同时将不断变化的区域和资源保持为一个数据对象。

我尝试了group_by(.title(,它给了我一个错误";无法使用字符串"对字符串进行索引;标题";,我想做group_by(.title,.description,.message(.

我尝试了unique_by,但也出现了错误。

我当前的查询是

jq '.[] | {title : .title, description : .description, message : .message, data: [{region: .region, resource: .resource}] } | group_by(.title,.description,.message)'
jq -s '[.[]
| { title : .title,
description : .description,
message : .message,
data: [{region: [.region], resource: [.resource]}]
}
]
| group_by(.title, .descripiton, .message)
| .[]
| { title: .[0].title,
description: .[0].description,
message: .[0].message,
data:{
region: [.[].data[].region | add],
resource: [.[].data[].resource | add]
}}'

以下是@choroba程序的一个简洁变体,可能会引起兴趣,因为它将保留JSON对象的所有键,除了要合并的两个键:

map( . + {data: [{region: [.region], resource: [.resource]}]}
| del(.region, .resource) )
| group_by(.title, .description, .message)[]
| .[0] +
{ data: {
region:   [.[].data[].region   | add],
resource: [.[].data[].resource | add]
}
}

当然,它也应该与-s命令行选项一起使用。

最新更新