我想逐行打印json文件的每个路径和值以及包含的键值。我希望输出以逗号分隔,或者至少非常容易使用Linux命令行工具进行剪切和排序。给定以下json和jq,我们得到了jq代码,该代码似乎针对测试JSON进行了此操作,但是我不确定它在所有情况下均有效,或者是正确的方法。
jq中是否有一个自动执行此功能的功能?如果没有,那么有没有“最简洁的最佳方法”?
我的愿望是:
$ cat short.json | jq -doit '.'
Reservations,0,Instances,0,ImageId,ami-a
Reservations,0,Instances,0,InstanceId,i-a
Reservations,0,Instances,0,InstanceType,t2.micro
Reservations,0,Instances,0,KeyName,ubuntu
测试JSON:
$ cat short.json | jq '.'
{
"Reservations": [
{
"Groups": [],
"Instances": [
{
"ImageId": "ami-a",
"InstanceId": "i-a",
"InstanceType": "t2.micro",
"KeyName": "ubuntu"
}
]
}
]
}
推荐代码:
https://unix.stackexchange.com/questions/561460/how-to-print-path-and-key-values-of-json-file
支持:
https://unix.stackexchange.com/questions/515573/convert-json-file-to-a-key-path-with-the-resulting-value-at-the-end-of-each-k
JQ代码太长而复杂!
jq -r '
paths(scalars) as $p
| [ ( [ $p[] | tostring ] | join(".") )
, ( getpath($p) | tojson )
]
| join(": ")
' short.json
Result:
Reservations.0.Instances.0.ImageId: "ami-a"
Reservations.0.Instances.0.InstanceId: "i-a"
Reservations.0.Instances.0.InstanceType: "t2.micro"
Reservations.0.Instances.0.KeyName: "ubuntu"
答案 0 :(得分:1)
一个简单的jq查询以实现所需的格式:
paths(scalars) as $p
| $p + [getpath($p)]
| join(",")
如果您的jq是古老的并且无法升级,请在上面的最后一行之前插入| map(tostring)
。
Reservations,0,Instances,0,ImageId,ami-a
Reservations,0,Instances,0,InstanceId,i-a
Reservations,0,Instances,0,InstanceType,t2.micro
Reservations,0,Instances,0,KeyName,ubuntu
如果键或原子值包含“,”,那么当然不建议使用逗号。因此,最好使用不能出现在JSON键或原子值中的字符(例如TAB)。因此,请考虑使用@tsv
:
paths(scalars) as $p
| $p + [getpath($p)]
| @tsv
(上面有关jq的古代版本的注释也适用于此。)
答案 1 :(得分:0)
将其读取为流。
$ jq --stream -r 'select(.[1]|scalars!=null) | "\(.[0]|join(".")): \(.[1]|tojson)"' short.json