從 Json 結構中,我想要一個特定的字典。從鍵的顏色黃色或紅色,我添加 id 值。
[
{
"id": "9b058640",
"type": "db",
"color": "red",
"host": "db1"
},
{
"id": "0u858640",
"type": "db",
"color": "yellow",
"host": "db2"
},
{
"id": "0ui9k40",
"type": "net",
"color": "red",
"host": "net1"
},
{
"id": "5ty87a",
"type": "net",
"color": "yellow",
"host": "net2"
}
]
所以我想得到 X 字典
X=(
['yellow']="9b058640 5ty87a"
['red']="9b058640 0ui9k40"
)
我可以按值決議:
jq -c '.[] | select(.color | contains("red"))'
uj5u.com熱心網友回復:
您可以使用@tsvjq 中的運算子發出制表符分隔的輸出,bashwhile read回圈可以輕松地將其決議為輸入。
假設您的輸入 JSON 在變數中s:
declare -A X=( )
while IFS=$'\t' read -r color id; do
X[$color] ="$id "
done < <(jq -r '.[] | [.color, .id] | @tsv' <<<"$s")
上面確實采取了一個小捷徑,因為它在每個專案之后留下一個尾隨空格。如果由于某種原因這是不可接受的,您總是可以通過陣列并在事后使用第二個回圈清理它:
for color in "${!X[@]}"; do
X[$color]=${X[$color]%" "}
done
您可以在https://replit.com/@CharlesDuffy2/IndigoRemoteEngineering的沙箱中看到它正在運行
或者,使用eval:
#!/usr/bin/env bash
case $BASH_VERSION in ''|[0-3].*) echo "ERROR: bash 4.0 required" >&2; exit 1;; esac
declare -A X=( )
eval "$(
jq -r '
reduce .[] as $item ({}; .[$item.color] = [$item.id])
| to_entries[]
| "X[\(.key | @sh)]=\(.value | join(" ") | @sh)"
'
)" <file.json
uj5u.com熱心網友回復:
不需要., source,eval甚至在 bash 中回圈。您需要的只是declareand ,它可以使用轉義with和字串插值jq構造宣告:@sh
declare -A X="($(
jq -r '
("yellow", "red") as $color
| @sh "[\($color)]=\(map(select(.color == $color).id) | join(" "))"
' input.json
))"
$ echo "${X[yellow]}"
0u858640 5ty87a
$ echo "${X[red]}"
9b058640 0ui9k40
uj5u.com熱心網友回復:
回答:
declare -A a
. <(jq -r '"a[\(.color)] =${a[\(.color)] }\(.id)"' file.json)
提供:
$ declare -p a
$ declare -A a=([red]="9b058640 0ui9k40" [yellow]="0u858640 5ty87a" )
# or
$ echo "${a[red]}"; echo "${a[yellow]}"
9b058640 0ui9k40
0u858640 5ty87a
解釋:
- 在 中構造以下 bash 代碼
jq: a[color] =${a[color] }id${a[color] }擴展為,僅當a[color]為空時。"\(.id)"是 jq 字串插值 - 它被替換為.id- 使用
.和一個流程子來獲取此代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/429792.html
