我是 jq 的新手,但我相信一旦我弄清楚它可以帮助我的工作流程。我收到了一些如下所示的数据:
{
"parent_name1": {
"parent_count": 2000,
"fields": {
"field1_count": 2000,
"field2_count": 2000,
...
"fieldx_count": 20
}
},
"parent_name2": {
"parent_count": 1000,
"fields": {
"field1_count": 1000,
"field2_count": 1000,
...
"fieldx_count": 100
}
},
"parent_namex": {
...
}
}
我想做两件事:
- 选择特定的父名称并让它显示名称和所有子值(计数和所有字段计数)。
- 显示字段计数小于父项总数的所有父项名称。
我很接近以下命令,但它们仍然不完全是我想要的位置:
jq '."parent_name1"'
会给我“parent_count”、“fields”和所有字段计数,但不提供父名称。
这:
jq '.[] | {parent_count: .parent_count, fields: .fields[]} | select(.fields < .parent_count)'
返回“parent_count”和总字段计数,但不返回父名称或各个字段的计数。我知道字段计数的总和来自{fields: .fields[]}
,但如果没有它,我找不到任何方法来接近我想要的结果。
答案1
正如您所注意到的,使用
jq '.parent_name2' file
或者,将节的名称作为参数给出,
jq --arg parent 'parent_name2' '.[$parent]' file
不会输出parent_name2
作为顶级键的 JSON 对象。
然而,我们可以创造具有所需数据的对象:
$ jq --arg parent 'parent_name2' '{($parent): .[$parent]}' file
给定示例文档的经过清理的变体,这将产生
{
"parent_name2": {
"parent_count": 1000,
"fields": {
"field1_count": 1000,
"field2_count": 1000,
"fieldx_count": 100
}
}
}
在您的第二个查询中(请以后每个问题只查询一个查询),您可能会询问与.parent_count
值小于相应.fields
计数总和的对象相对应的顶级键名称。
jq -r 'del(.[] | select(.parent_count >= (.fields | add ))) | keys[]' file
这删除值之和.fields
大于或等于该.parent_count
值的所有部分。然后,它提取剩余所有部分的顶级键名称。