jq は親名、値、子値を出力します。

jq は親名、値、子値を出力します。

私は最初に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つのことをしたい:

  1. 特定の親名を選択し、名前とすべての子値(数とすべてのフィールド数)を表示するようにします。
  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_count2番目のクエリ(今後は質問ごとに1つのクエリのみをクエリします)では、値がその数の合計より小さいオブジェクト.fieldsに対応する最上位キー名を要求できます。

jq -r 'del(.[] | select(.parent_count >= (.fields | add ))) | keys[]' file

これ削除.fields合計がその値以上の値.parent_countのすべての部分です。次に、残りのすべての部分の最上位キー名を抽出します。

関連情報