Извлечение данных из вложенного JSON и преобразование в TSV - PullRequest
0 голосов
/ 10 апреля 2020

Я смотрю на вложенный синтаксический анализ json. Для примера ниже, я знаю, что он появляется на Github - однако из-за чувствительности я не могу опубликовать свои фактические данные здесь.

Я смотрел на jq для форматирования, и могу вытащить каждый компонент, но не могу объединить их вместе так, как это показано ниже.

Из-за ограничений программного обеспечения, я не может использовать сторонний код.

вход:

{   "asgs": [
{
  "name": "test1",
  "instances": [
    {"id": "i-9fb75dc", "az": "us-east-1a", "state": "InService"},
    {"id": "i-95393ba", "az": "us-east-1a", "state": "Terminating:Wait"},
    {"id": "i-241fd0b", "az": "us-east-1b", "state": "InService"}
  ]
},
{
  "name": "test2",
  "instances": [
    {"id": "i-4bbab16", "az": "us-east-1a", "state": "InService"},
    {"id": "i-417c312", "az": "us-east-1b", "state": "InService"}
  ]
}   ] }

выход:

test1   i-9fb75dc       us-east-1a      InService
test1   i-95393ba       us-east-1a      Terminating:Wait
test1   i-241fd0b       us-east-1b      InService
test2   i-4bbab16       us-east-1a      InService
test2   i-417c312       us-east-1b      InService

РЕДАКТИРОВАТЬ: Текущий код таков, что I l oop через все экземпляры из instances, а затем добавьте имена. Например:

cat sampleData.json | jq -c '.' | while read i; do
echo $i, & jq '.instances' sampleData.json
done

Ответы [ 3 ]

5 голосов
/ 10 апреля 2020

Немного более короткая (хотя и несколько более сложная) версия ответа @ anubhava:

jq -r '.asgs[] | .name as $n | (.instances[] | [$n, .id, .az, .state] | @tsv)' file.json

Это «запоминает» каждое имя перед созданием строки, разделенной табуляцией, для каждого экземпляра, вставляя правильное имя в каждый грести.

4 голосов
/ 10 апреля 2020

Вы можете использовать это jq:

jq -r '.asgs[] | .name + "\t" + (.instances[] | .id + "\t" + .az + "\t" + .state)' file.json

test1   i-9fb75dc   us-east-1a  InService
test1   i-95393ba   us-east-1a  Terminating:Wait
test1   i-241fd0b   us-east-1b  InService
test2   i-4bbab16   us-east-1a  InService
test2   i-417c312   us-east-1b  InService
0 голосов
/ 10 апреля 2020

Вы можете использовать шаблон c map для создания дополнительной записи для каждого экземпляра:

jq -r '.asgs[] | [.name] + (.instances[] | map(.)) | @tsv'
...