私は最初にjqに触れましたが、一度理解したら私のワークフローに役立つと確信しています。次のデータを受け取りました。
{
"parent_name1": {
"parent_count": 2000,
"fields": {
"field1_count": 2000,
"field2_count": 2000,
...
"fieldx_count": 20
}
},
"parent_name2": {
"parent_count": 1000,
"fields": {
"field1_count": 1000,
"field2_count": 1000,
...
"fieldx_count": 100
}
},
"parent_namex": {
...
}
}
私は2つのことをしたい:
- 特定の親名を選択し、名前とすべての子値(数とすべてのフィールド数)を表示するようにします。
- フィールド数が全体の親数より少ないすべての親の名前を表示します。
次のコマンドをほとんど使用しましたが、まだ必要な場所にありません。
jq '."parent_name1"'
「parent_count」、「fields」、およびすべてのフィールド数は提供されますが、親名は提供されません。
これ:
jq '.[] | {parent_count: .parent_count, fields: .fields[]} | select(.fields < .parent_count)'
「parent_count」とフィールドの総数を返しますが、親名または個々のフィールドの数は返しません。フィールド数の合計がどこから出てくるのか知っていますが{fields: .fields[]}
、これがなければ希望の結果に近づける方法が見つかりません。
答え1
気づいたように、
jq '.parent_name2' file
または、セクション名を引数として指定します。
jq --arg parent 'parent_name2' '.[$parent]' file
parent_name2
最上位キーであるJSONオブジェクトは出力されません。
しかし、私たちはできます作る必須データを含むオブジェクト:
$ jq --arg parent 'parent_name2' '{($parent): .[$parent]}' file
サンプル文書の削除されたバリエーションが与えられた場合、これは次のようになります。
{
"parent_name2": {
"parent_count": 1000,
"fields": {
"field1_count": 1000,
"field2_count": 1000,
"fieldx_count": 100
}
}
}
.parent_count
2番目のクエリ(今後は質問ごとに1つのクエリのみをクエリします)では、値がその数の合計より小さいオブジェクト.fields
に対応する最上位キー名を要求できます。
jq -r 'del(.[] | select(.parent_count >= (.fields | add ))) | keys[]' file
これ削除.fields
合計がその値以上の値.parent_count
のすべての部分です。次に、残りのすべての部分の最上位キー名を抽出します。