我正在使用大型数据集,我正在使用JQ构建一个只包含我感兴趣的数据的对象。为了帮助解决这个问题,我提供了示例数据来帮助说明我的问题。
到目前为止,我只找到了添加2个对象或2个数组的方法,但我想采用一组平面字段,并将一个数组作为子对象添加到主json中。
tmpData.txt
{
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batter": [{
"id": "1001",
"type": "Regular",
"status":{
"complete": false
}
},
{
"id": "1002",
"type": "Chocolate",
"status":{
"complete": false
}
},
{
"id": "1003",
"type": "Blueberry",
"status":{
"complete": false
}
},
{
"id": "1004",
"type": "Devil's Food",
"status":{
"complete": false
}
}
]
}
到目前为止,我最接近的是这个
cat tmpData.txt | jq '[{id, type}] + [(.batter[] | {batterId: .id, complete: .status.complete})]'
只输出顶级字段一次,但每个面糊都是它自己的对象,我需要整个输出为1个对象。
[
{
"id": "0001",
"type": "donut"
},
{
"batterId": "1001",
"complete": false
},
{
"batterId": "1002",
"complete": false
},
{
"batterId": "1003",
"complete": false
},
{
"batterId": "1004",
"complete": false
}
]
我的理想输出如下所示:
{
"id": "0001",
"type": "donut",
"batter": [{
"id": "1001",
"complete": false
},
{
"id": "1002",
"complete": false
},
{
"id": "1003",
"complete": false
},
{
"id": "1004",
"complete": false
}]
}
正如您所看到的,有一个单个对象包含我需要知道的所有内容,并且没有重复或无关的数据。我想输出一个包含一系列具有ID及其状态的击球手的对象。
答案 0 :(得分:0)
jq仅支持使用+
运算符添加相同的数据类型。您无法将数组添加到对象,反之亦然。
为了向对象添加数组,我们必须将数组包装在一个对象中,并为包含该数组的对象提供键。如果我们考虑json结构以及如何在json对象中表示数组
,这是有意义的以下命令将对tmpData.txt
文件
cat tmpData.txt | jq '{id, type} + {Batters: [(.batter[] | {batterId: .id, batterType: .type, status: .status.complete})]}'
输出
{
"id": "0001",
"type": "donut",
"Batters": [
{
"batterId": "1001",
"batterType": "Regular",
"status": false
},
{
"batterId": "1002",
"batterType": "Chocolate",
"status": false
},
{
"batterId": "1003",
"batterType": "Blueberry",
"status": false
},
{
"batterId": "1004",
"batterType": "Devil's Food",
"status": false
}
]
}