次のfile1 jsonがあります。
{
"name": "eye",
"attributes": [
{
"name": "Width",
"value": "1920"
},
{
"name": "Height",
"value": "1080"
},
{
"name": "WinKeyMapping",
"value": "leftwin"
}
],
"starts": [
{
"name": "step1",
"attributeList": [
{
"name": "Command",
"value": "bash"
},
{
"name": "Test",
"value": "none"
}
]
}
]
}
そして次のフィルタ:
$ jq '.starts[].attributeList[]|select(.name=="Command")' file1
{
"name": "Command",
"value": "bash"
}
$
この選択肢の全体構造をどのように取得できますか?
予想出力:
{
"starts": [
{
"attributeList": [
{
"name": "Command",
"value": "bash"
}
]
}
]
}
答え1
直接jq
:
jq '{ starts: [ { attributeList: (.starts[].attributeList
| map(select(.name == "Command"))) }] }' file.json
出力:
{
"starts": [
{
"attributeList": [
{
"name": "Command",
"value": "bash"
}
]
}
]
}
答え2
以下は、目的の出力を取得する2つのオプションです。
不要なキーを削除できます。
jq 'del(.attributes, .name) |
.starts[].attributeList = map(.[].attributeList[] | select(.name == "Command"))'
あるいは、希望のキーを選択することもできます。
jq 'to_entries | map(select(.key == "starts")) | from_entries |
.starts[].attributeList = map(.[].attributeList[] | select(.name == "Command"))'
どちらも同じ結果を提供します。必要に応じて、starts
後者ends
の場合は追加のor
ステートメントを追加できますmap(select((.key == "starts") or (.key == "ends")))
。
答え3
より一般的なアプローチは次のとおりですjq
。
def pick_out(q): path(q) as $path | ($path | length) as $length |
delpaths(
[
paths(..) |
select(length <= $length and $path[0:length] != . )
]
);
これはjq
、指定された引数(呼び出し可能)のパスのどこにもない文書へのすべてのパスを削除する関数ですselect()
。
保存すると、pick_out.jq
次のように使用できます。
jq 'include "pick_out";
pick_out(
.starts[].attributeList[] | select(.name == "Command")
)' file.json
出力:
{
"starts": [
{
"attributeList": [
{
"name": "Command",
"value": "bash"
}
]
}
]
}