我想在jq. 陣列中的每個物件都包含名稱欄位,它允許我將兩個陣列分組并將其合并為一個。
標簽
[
{
"name": "power_branch",
"description": "master"
},
{
"name": "test_branch",
"description": "main"
}
]
跑者
[
{
"name": "power_branch",
"runner": "power",
"runner_tag": "macos"
},
{
"name": "power_branch",
"runner": "power",
"runner_tag": "ubuntu"
},
{
"name": "test_branch",
"runner": "tester",
"runner_tag": ""
},
{
"name": "development",
"runner": "dev",
"runner_tag": "ubuntu"
}
]
期望輸出
[
{
"name": "power_branch",
"description": "master",
"runner": "power",
"runner_tag": "macos"
},
{
"name": "power_branch",
"description": "master",
"runner": "power",
"runner_tag": "ubuntu"
},
{
"name": "test_branch",
"description": "main",
"runner": "tester",
"runner_tag": ""
}
]
我嘗試使用以下腳本,但 power_branch 條目被覆寫,相反我想要另一個具有不同 runner_tag 的條目
#!/usr/bin/bash
LABELS='[{"name": "power_branch","description": "master"},{"name": "test_branch","description": "main"}]'
RUNNERS='''
[
{ "name": "power_branch", "runner": "power", "runner_tag": "macos" },
{ "name": "power_branch", "runner": "power", "runner_tag": "ubuntu" },
{ "name": "test_branch", "runner": "tester", "runner_tag": "" },
{ "name": "development", "runner": "dev", "runner_tag": "ubuntu" }
]
'''
FINAL=$(jq -s '[ .[0] .[1] | group_by(.name)[] | select(length > 1) | add]' <(echo $LABELS) <(echo $RUNNERS))
echo $FINAL
輸出
[
{
"name": "power_branch",
"description": "master",
"runner": "power",
"runner_tag": "ubuntu"
},
{
"name": "test_branch",
"description": "main",
"runner": "tester",
"runner_tag": ""
}
]
uj5u.com熱心網友回復:
如果您有兩個檔案labels.json和runners.json,則可以--argjson使用map由select.
jq --argjson runners "$(cat runners.json)" '
map(.name as $name | . ($runners[] | select(.name == $name)))
' labels.json
但是,這會將整個 runners 陣列讀入您的 shell 命令列空間(--argjson需要兩個字串:一個名稱和一個值),如果 runners 陣列足夠大,很容易溢位。
因此,不是使用命令替換 "$(…)",您可以直接使用 runners 檔案讀取--slurpfile另一個迭代級別的成本[][],或者(盡管手冊說不要 - 在評論中閱讀更多相關資訊)--argfile僅使用單個迭代級別和以前一樣:
jq --slurpfile runners runners.json '
map(.name as $name | . ($runners[][] | select(.name == $name)))
' labels.json
jq --argfile runners runners.json '
map(.name as $name | . ($runners[] | select(.name == $name)))
' labels.json
為了規避所有這些問題,@peak建議將inputfor 每個檔案與-n選項一起使用。請注意,這要求在順序讀取兩個檔案時按此確切順序提供它們。
jq -n 'input as $runners | input |
map(.name as $name | . ($runners[] | select(.name == $name)))
' runners.json labels.json
由于第二個input(標簽)直接作為過濾器的主要輸入傳遞(與運行程式相反,運行程式存盤在變數中供以后使用),這可以通過再次洗掉該-n選項來進一步簡化(檔案的順序仍然很重要) :
jq 'input as $runners |
map(.name as $name | . ($runners[] | select(.name == $name)))
' runners.json labels.json
最后,這是使用SQL 樣式運算子的 另一種方法INDEX,JOIN該方法已在 jq v1.6 中引入。這也采用了只使用一個的技術input,而且檔案的順序仍然很重要,因為我們需要 runners 陣列作為過濾器的主要輸入。
jq '
JOIN(INDEX(input[]; .name); .name) | map(select(.[1]) | add)
' runners.json labels.json
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/403360.html
標籤:
