【发布时间】:2022-01-14 17:27:07
【问题描述】:
我想我离弄清楚如何通过 filter 将一个键 jq reduce 转换为另一个对象子键还差了一步。
我正在尝试合并文件(简化自 Elasticsearch 的 ILM Explain 和 ILM Policy API 响应):
$ echo '{".siem-signals-default": {"modified_date": "siem", "version": 1 }, "kibana-event-log-policy": {"modified_date": "kibana", "version": 1 } }' > ip1.json
$ echo '{"indices": {".siem-signals-default-000001": {"action": "complete", "index": ".siem-signals-default-000001", "policy" : ".siem-signals-default"} } }' > ie1.json
这样生成的 JSON 是:
{
".siem-signals-default-000001": {
"modified_date": "siem",
"version": 1
"action": "complete",
"index": ".siem-signals-default-000001",
"policy": ".siem-signals-default"
}
}
其中 ie1 是基本 JSON 并且对于子对象,其子元素 policy 应与 ip1 的键对齐并将其子元素复制到自身中。我一直在尝试构建 this、this 和 this(来自 StackOverflow,也来自外部来源的 this、this、this)。我将在这些基础上列出各种兔子洞尝试,但它们都不够:
$ ((cat ie1.json | jq '.indices') && cat ip1.json) | jq -s 'map(to_entries)|flatten|from_entries' | jq '. as $v| reduce keys[] as $k({}; if true then .[$k] += $v[$k] else . end)'
{
".siem-signals-default": {
"modified_date": "siem",
"version": 1
},
".siem-signals-default-000001": {
"action": "complete",
"index": ".siem-signals-default-000001",
"policy": ".siem-signals-default"
},
"kibana-event-log-policy": {
"modified_date": "kibana",
"version": 1
}
}
$ jq --slurpfile ip1 ip1.json '.indices as $ie1|$ie1+{ilm: $ip1 }' ie1.json
{
".siem-signals-default-000001": {
"action": "complete",
"index": ".siem-signals-default-000001",
"policy": ".siem-signals-default"
},
"ilm": [
{
".siem-signals-default": {
"modified_date": "siem",
"version": 1
},
"kibana-event-log-policy": {
"modified_date": "kibana",
"version": 1
}
}
]
}
我也希望这样的东西可以工作,但它编译错误
$ jq -s ip1 ip1.json '. as $ie1|$ie1 + {ilm:(keys[] as $k; $ip1 | select(.policy == $ie1[$k]) | $ie1[$k] )}' ie1.json
jq: error: ip1/0 is not defined at <top-level>, line 1:
ip1
jq: 1 compile error
从这里你可以看到,我已经确定了加入单独文件的各种方法,但是虽然我有我认为可以用于过滤的代码,但它不正确/不生效。有谁知道如何让过滤器部分工作? TIA
【问题讨论】:
-
那些键不匹配,这是故意的吗?