我想我離弄清楚如何通過過濾一個鍵到另一個物件子鍵來減少jq 還差了一步。
我正在嘗試合并檔案(從 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
uj5u.com熱心網友回復:
這假設您正在嘗試將.indices存盤在ie1.json中的物件與存盤在ip1.json. 由于要匹配的鍵不同,我進一步假設您想要匹配物件中的欄位名稱.indices,通過切斷最后一個 dash 之后的所有內容來減少物件-中的相同鍵 from ip1.json。
為此,ip1.json從inputas讀入$ip(或者您可以使用jq --argfile ip ip1.json它),然后.indices從第一個輸入中獲取物件,并將通過匹配的查找結果添加到ie1.json訪問的內部物件,并相應地減少.with_entries(.value …)$ip.key
jq '
input as $ip | .indices | with_entries(.value = $ip[.key | sub("-[^-]*$";"")])
' ie1.json ip1.json
{
".siem-signals-default-000001": {
"action": "complete",
"index": ".siem-signals-default-000001",
"policy": ".siem-signals-default",
"modified_date": "siem",
"version": 1
}
}
演示
如果.indices您希望將欄位的內容.index作為參考(在您的示例資料中具有相同的值)而不是物件的內部欄位 nane,您可以使用map_values而不是,with_entries因為您不再需要該欄位的名稱。
jq '
input as $ip | .indices | map_values(. = $ip[.index | sub("-[^-]*$";"")])
'ie1.json ip1.json
演示
注意:我使用sub正則運算式來操作鍵名,如果實際上它更復雜,您可以根據自己的喜好輕松調整。但是,如果該模式實際上就像在最后一個破折號后切斷一樣簡單,那么使用.[:rindex("-")]代替也將完成作業。
uj5u.com熱心網友回復:
我還收到了一個簡單的“適用于我的用例”但不是確切答案的離線反饋:
$ jq '.indices | map(. * input[.policy])' ie1.json ip1.json
[
{
"action": "complete",
"index": ".siem-signals-default-000001",
"policy": ".siem-signals-default",
"modified_date": "siem",
"version": 1
}
]
發布以防有人遇到類似情況,但其他答案更好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/412233.html
標籤:
