Как напечатать значения пути и ключа для файла JSON, используя JQ - PullRequest
0 голосов
/ 12 января 2020

Я хотел бы печатать каждый путь и значение файла с включенными значениями ключа построчно. Мне бы хотелось, чтобы выходные данные были разделены запятыми или, по крайней мере, их было легко вырезать и сортировать с помощью инструментов командной строки Linux. Учитывая следующие и , мне дали код, который, кажется, делает это для теста JSON, но я не уверен это работает во всех случаях или является правильным подходом.

Есть ли в функция, которая делает это автоматически? Если нет, то есть ли «самый лаконичный лучший способ» сделать это?

Мой wi sh будет выглядеть примерно так:

$ 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


Test 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"  


Ответы [ 2 ]

0 голосов
/ 12 января 2020

Простой запрос jq для получения запрошенного формата:

 paths(scalars) as $p
 | $p + [getpath($p)] 
 | join(",")

Если ваш 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

Caveat

Если значение ключа или атома c содержит ",", то, конечно, использование запятой может быть нежелательным. По этой причине может быть предпочтительнее использовать такой символ, как TAB, который не может отображаться в ключе JSON или значении atomi c. Поэтому рассмотрите возможность использования @tsv:

paths(scalars) as $p
| $p + [getpath($p)]
| @tsv

(комментарий выше о древних версиях jq применим и здесь.)

0 голосов
/ 12 января 2020

Читать как поток.

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