我需要操作数组中的对象,这些对象的单个键不是固定的公共字符串。这是一个简单的示例:
echo '{ "a": { "b" : 1 } }'|jq '. as $save|keys'
因此,问题是“ a”可能是任何东西。因此,我不能使用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
答案 0 :(得分:1)
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"