jq 打印父名称、值和子值

jq 打印父名称、值和子值

我是 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": {
    ...
  }
}

我想做两件事:

  1. 选择特定的父名称并让它显示名称和所有子值(计数和所有字段计数)。
  2. 显示字段计数小于父项总数的所有父项名称。

我很接近以下命令,但它们仍然不完全是我想要的位置:

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值的所有部分。然后,它提取剩余所有部分的顶级键名称。

相关内容