列出每个具有父名称的特定元素

list each specific element with parent name

我有 json 个数组中的随机元素:

[
  {
    "system": {
      "name": "sys1",
      "interfaces": [
        {
          "ip": "1.1.1.1",
          "ent": "ent1"
        },
        {
          "ip": "2.2.2.2",
          "ent": "ent0"
        }
      ]
    }
  },
  {
    "system": {
      "name": "sys2",
      "interfaces": [
        {
          "ip": "3.3.3.3",
          "ent": "ent0"
        }
      ]
    }
  },
  {
    "system": {
      "name": "sys3",
      "interfaces": null
    }
  },
  {
    "system": {
      "name": "sys4"
    }
  }
]

我需要使用 jq 获得以下输出:

sys1    1.1.1.1 ent1
sys1    2.2.2.2 ent0
sys2    3.3.3.3 ent0

我试过以下过滤器:

$ jq -r '.[]|[.system.name, .system.interfaces[].ip, .system.interfaces[].ent]|@tsv' test_json2
sys1    1.1.1.1 2.2.2.2 ent1    ent0
sys2    3.3.3.3 ent0

如何拆分第 1 行以达到预期结果?

更新:当数组为空时我遇到了新情况,现在我使用 pmf 的答案中的 filrer 得到以下错误:

jq: error (at test_json2:34): Cannot iterate over null (null) 

在包含 .name 的数组外迭代。这样,每个迭代步骤都会生成另一个数组。

jq -r '.[].system | [.name] + (.interfaces[]? | [.[]]) | @tsv' test_json2

Demo

如果.interfaces数组中的对象可以有不止这两个字段,但您只想输出这两个字段,请明确命名。

jq -r '.[].system | [.name] + (.interfaces[]? | [.ip, .ent]) | @tsv' test_json2

Demo

输出为:

sys1    1.1.1.1 ent1
sys1    2.2.2.2 ent0
sys2    3.3.3.3 ent0

您可以使用array对每个接口进行分组。

.[] | .system | select(.name=="sys1" or .name=="sys2") | [.name] + (.interfaces[] | [.[]]) | @tsv

演示

https://jqplay.org/s/iucSZqkB1r

请注意 .[] 在一个对象上 returns 它的 values