JQ программа для манипулирования объектами с неизвестными ключами - PullRequest
0 голосов
/ 20 февраля 2019

Мне нужно манипулировать объектами в массиве, где единственный ключ этих объектов не является фиксированной, общей строкой.Вот очень быстрый пример:

echo '{ "a": { "b" : 1 } }'|jq '. as $save|keys'

Итак, проблема в том, что «а» может быть чем угодно.Итак, я не могу использовать jq '.a'.Единственный способ узнать имя ключа - использовать встроенную функцию keys .Однако, похоже, что ключи не хотят играть вместе с запятой (выдает синтаксическую ошибку, например:)

echo '{ "a": { "b" : 1 } }'|jq 'keys, . as $save|$save[.]'

, и если вы измените их как единственный этап конвейера, вы получите еще одну ошибку:

echo '{ "a": { "b" : 1 } }'|jq '. as $save, keys'
jq: error: syntax error, unexpected ',', expecting 
'|' (Unix shell quoting issues?) at <top-level>, 
line 1:  . as $save, keys
jq: 1 compile error

Кажется, что ключи ожидают быть единственным оператором на входе и единственным источником вывода.

Есть ли другой способ найти"a"?

Если я привел слишком упрощенный пример, который я привел, и вы не поняли проблему, тогда, пожалуйста, рассмотрите подмножество данных, которыми мне действительно нужно манипулировать:

{
  "rows": [
    {
      "i-0cf0": {
        "chef_environment": "alpha-prod",
        "ec2.placement_availability_zone": "us-east-1d"
      }
    },
    {
      "i-f9aa": {
        "chef_environment": "alpha-qa",
        "ec2.placement_availability_zone": "us-east-1b"
      }
    }
  ]
}

Комментарии побудили меня добавить этот дополнительный контент.Пример дополнительных манипуляций, которые я хочу сделать для вышеуказанного ввода: выбор на основе определенных значений chef_environment и для них, вывод ключа и зоны доступности, например,

i-f9aa,us-east-1b

1 Ответ

0 голосов
/ 20 февраля 2019

Функция jq to_entries преобразует { "KEY": "VALUE" } в { "key": "KEY", "value": "VALUE" }.

Учитывая это, вы можете обращаться непосредственно к клавишам или к значениям, с которыми они сопоставлены, следующим образом:

.rows[] | to_entries[] |  [.key, .value["ec2.placement_availability_zone"]] | @csv

... с учетом вашего ввода, выводов (при работе в необработанном режиме):

"i-0cf0","us-east-1d"
"i-f9aa","us-east-1b"
...