{ "045eb00f-e662-4c06-b1ea-052eeefe6307": { "name": "hoge", "score": 1078 }, "85ee1327-aee9-4645-bf01-e035ddfe7ee6": { "name": "fuga", "score": 961 }, "727c03fa-08d2-4fa3-9143-c64f5fc3d404": { "name": "piyo", "score": 1609 } }
エントリのコレクションを配列ではなく上のようにIDをキーとしたオブジェクトで表現したJSONがある。
ここからある条件に合致したエントリ(オブジェクトのメンバ)をjqで抽出するにはどうするか?
to_entries
to_entries
を使うとオブジェクトを配列に変換することができる。
jq to_entries
[ { "key": "045eb00f-e662-4c06-b1ea-052eeefe6307", "value": { "name": "hoge", "score": 1078 } }, { "key": "85ee1327-aee9-4645-bf01-e035ddfe7ee6", "value": { "name": "fuga", "score": 961 } }, { "key": "727c03fa-08d2-4fa3-9143-c64f5fc3d404", "value": { "name": "piyo", "score": 1609 } } ]
オブジェクトのメンバを表すオブジェクト {"key": "キー", "value": "値"}
を要素とする配列が手に入る。
配列になってしまえば後は select
関数が使える。
# scoreが1000以上のエントリのみ抽出 jq 'to_entries | map(select(1000 <= .value.score))'
[ { "key": "045eb00f-e662-4c06-b1ea-052eeefe6307", "value": { "name": "hoge", "score": 1078 } }, { "key": "727c03fa-08d2-4fa3-9143-c64f5fc3d404", "value": { "name": "piyo", "score": 1609 } } ]
from_entries
from_entries
で逆方向の変換もできる。
# scoreが1000以上のエントリのみ抽出 jq 'to_entries | map(select(1000 <= .value.score)) | from_entries'
{ "045eb00f-e662-4c06-b1ea-052eeefe6307": { "name": "hoge", "score": 1078 }, "727c03fa-08d2-4fa3-9143-c64f5fc3d404": { "name": "piyo", "score": 1609 } }