首页 > 解决方案 > 用未知键操作对象的 jq 程序

问题描述

我需要操作数组中的对象,其中这些对象的单个键不是固定的通用字符串。这是一个真正的快速示例:

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

所以,问题是“a”可以是任何东西。所以,我不能使用 jq '.a'。我发现获取密钥名称的唯一方法是通过密钥内置函数。但是,键似乎不想与逗号一起播放(抛出语法错误,例如:)

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

标签: jsonjq

解决方案


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"

推荐阅读