json - 用未知键操作对象的 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
解决方案
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"
推荐阅读
- c++ - 在同一个命名空间调用函数失败+继承问题
- python - Pyinstaller 无法导入模块 __PyInstaller_hooks_0_pydoc
- c# - “解构赋值需要右侧类型的表达式”
- python - 使用 selenium python 进行缩放时未检测到警报
- java - 无法创建 JPA/CRUDRepository bean
- swiftui - SwiftUI,警报中断 NavigationLink?
- node.js - 出现错误 ReferenceError: primordials is not defined
- c# - 创建 Restful Web 服务以在 C# 中调用存储过程
- javascript - 带有 tensorflowjs 的 Vue3 应用程序抛出 TypeError:无法读取未定义的属性“后端”
- java - 无法使用 selenium 将文件从 C:downloads 移动到其他位置