Rya*_*yan 13 command-line json jq
我有一个由科学仪器创建的分层深度JSON对象,因此文件有点大(1.3MB)并且人们不易读取.我想获得一个JSON对象的密钥列表,直到某个深度.例如,给定一个像这样的输入对象
{
"acquisition_parameters": {
"laser": {
"wavelength": {
"value": 632,
"units": "nm"
}
},
"date": "02/03/2525",
"camera": {}
},
"software": {
"repo": "github.com/username/repo",
"commit": "a7642f",
"branch": "develop"
},
"data": [{},{},{}]
}
Run Code Online (Sandbox Code Playgroud)
我想要这样的输出.
{
"acquisition_parameters": [
"laser",
"date",
"camera"
],
"software": [
"repo",
"commit",
"branch"
]
}
Run Code Online (Sandbox Code Playgroud)
这主要是为了能够枚举JSON对象中的内容.处理后,仪器中的JSON对象开始发散:例如,某些字段可能具有类似字段.frame.cross_section.stats.fwhm,而其他字段可能具有字段.sample.species,因此能够在命令行上查询JSON对象会很方便.
mwa*_*wag 12
以下应该完全符合您的要求
jq '[(keys - ["data"])[] as $key | { ($key): .[$key] | keys }] | add'
Run Code Online (Sandbox Code Playgroud)
这将使用您上面描述的输入提供以下输出:
{
"acquisition_parameters": [
"camera",
"date",
"laser"
],
"software": [
"branch",
"commit",
"repo"
]
}
Run Code Online (Sandbox Code Playgroud)
小智 6
鉴于您的目的,您可能会更轻松地使用paths内置函数列出输入中的所有路径,然后在所需深度处截断:
$ echo '{"a":{"b":{"c":{"d":true}}}}' | jq -c '[paths|.[0:2]]|unique'
[["a"],["a","b"]]
Run Code Online (Sandbox Code Playgroud)