JQ 使用包含的父键过滤数据

JQ 使用包含的父键过滤数据

我有给定内容的 json:

元素.json

{
  "Metals": {
    "AlkaliMetals": {
      "Lithium": {
        "MeltingPoint": "453",
        "BoilingPoint": "1615"
      },
      "Sodium": {
        "MeltingPoint": "371",
        "BoilingPoint": "1156"
      }
    },
    "AlkalineEarthMetals": {
      "Beryllium": {
        "MeltingPoint": "1560",
        "BoilingPoint": "2743"
      },
      "Magnesium": {
        "MeltingPoint": "923",
        "BoilingPoint": "1363"
      }
    }
  },
  "Metalloids": {
    "Metaloids": {
      "Boron": {
        "MeltingPoint": "2348",
        "BoilingPoint": "4273"
      },
      "Silicon": {
        "MeltingPoint": "1687",
        "BoilingPoint": "3173"
      }
    }
  }
}

目前我使用以下命令生成输出:

jq -r -S '.[][] | keys[] as $k | "\($k):\(.[$k] | .MeltingPoint):\(.[$k] | .BoilingPoint)"' elements.json

这给了我:

Lithium:453:1615 ...

我想将此扩展为也有父密钥:

AlkaliMetals:Lithium:453:1615 ...

或所有键:

Metals:AlkaliMetals:Lithium:453:1615 ...

我怎样才能做到这一点?

答案1

鉴于您显示的 JSON 文档:

$ jq -r 'path(.[][][]) as $p | "\($p|join(":")):\(getpath($p).MeltingPoint):\(getpath($p).BoilingPoint)"' file.json
Metals:AlkaliMetals:Lithium:453:1615
Metals:AlkaliMetals:Sodium:371:1156
Metals:AlkalineEarthMetals:Beryllium:1560:2743
Metals:AlkalineEarthMetals:Magnesium:923:1363
Metalloids:Metaloids:Boron:2348:4273
Metalloids:Metaloids:Silicon:1687:3173

Lithium这将文档第 3 层的所有对象的“路径”(即、等结构的路径Sodium)迭代为$p。每个$p都是一个类似的数组["Metals","AlkaliMetals","Sodium"]。它使用当前路径通过将路径与:分隔符连接起来来创建每个输出行的初始部分。实际的沸腾和熔化温度是从当前路径获取的getpath(),并将值附加到字符串的末尾。

这似乎也适用于您链接到的较大文件,但输出null缺少温度数据。

相关内容