如何使用JQ打印JSON文件的路径和键值

moj*_*joa 5 json path jq

我想逐行打印包含键值的我希望输出以逗号分隔,或者至少很容易使用 Linux 命令行工具进行剪切和排序。鉴于以下,我已经获得了代码,它似乎是为测试 JSON 执行此操作的,但我不确定它在所有情况下都有效或者是正确的方法。

中有一个函数可以自动执行此操作吗?如果没有,是否有“最简洁的最佳方法”来做到这一点?

我的愿望是这样的:

$ 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


Run Code Online (Sandbox Code Playgroud)

测试 JSON:

$ cat short.json | jq '.'
{
  "Reservations": [
    {
      "Groups": [],
      "Instances": [
        {
          "ImageId": "ami-a",
          "InstanceId": "i-a",
          "InstanceType": "t2.micro",
          "KeyName": "ubuntu"
        }
      ]
    }
  ]
}  
Run Code Online (Sandbox Code Playgroud)

推荐代码:
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"  


Run Code Online (Sandbox Code Playgroud)

pea*_*eak 7

一个简单的jq查询来实现请求的格式:

 paths(scalars) as $p
 | $p + [getpath($p)] 
 | join(",")
Run Code Online (Sandbox Code Playgroud)

如果您的 jq 很旧并且无法升级,请| map(tostring)在上面最后一行之前插入。

使用 -r 选项输出

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
Run Code Online (Sandbox Code Playgroud)

警告

如果键或原子值包含“,”,那么当然使用逗号可能是不可取的。因此,最好使用不能出现在 JSON 键或原子值中的字符,例如 TAB。因此考虑使用@tsv

paths(scalars) as $p
| $p + [getpath($p)]
| @tsv
Run Code Online (Sandbox Code Playgroud)

(上面关于 jq 的古代版本的评论也适用于此。)


Jef*_*ado 2

将其作为流读取。

$ jq --stream -r 'select(.[1]|scalars!=null) | "\(.[0]|join(".")): \(.[1]|tojson)"' short.json
Run Code Online (Sandbox Code Playgroud)