jqの出力深度を制限します。

jqの出力深度を制限します。

を使用して任意の文書を閲覧したいjq。これを行うには、jq文書の深さを制限し、最初のn(たとえば3)レベルのみを表示したいと思います。

次のJSONドキュメントがあるとします。

{
    "a": {
        "b": {
            "c": {
                "d": {
                    "e": "foo"
                }
            }
        }
    },
    "f": {
        "g": {
            "h": {
                "i": {
                    "j": "bar"
                }
            }
        }
    },
    "k": {
        "l": {
            "m": {
                "n": {
                    "o": "baz"
                }
            }
        }
    }
}

結果を期待しています

{
    "a": {
        "b": {
            "c": {}
        }
    },
    "f": {
        "g": {
            "h": {}
        }
    },
    "k": {
        "l": {
            "m": {}
        }
    }
}

文書の構造をあらかじめ知っていれば、かなり簡単な作業ですが、そうでない場合が多いです。これがjq、ドキュメント構造の最初のnレベルのみを表示できるようにしたい理由です。これは、辞書と配列を任意に入れ子にすることができます。

より複雑な例は次のとおりです。

[
    { "a": { "b": { "c": { "d": { "e": "foo"}}}}},
    { "f": [ { "g": "foo"}]},
    [ "h", "i", "j" ]
]

私が結果を期待しているところ

[
    { "a": { "b": {}},
    { "f": [{}]},
    [ "h", "i", "j" ]
]

私はjqこれを行うことができますか?

ベストアンサー1

del関数を配列/オブジェクト値イテレータと組み合わせて.[]?4番目のネストレベルからキー/値を削除すると、目的の結果が得られるようです。

$ jq 'del(.[]?[]?[]?[]?)' <<'EOT'
[
    { "a": { "b": { "c": { "d": { "e": "foo"}}}}},
    { "f": [ { "g": "foo"}]},
    [ "h", "i", "j" ]
]
EOT
[
  {
    "a": {
      "b": {}
    }
  },
  {
    "f": [
      {}
    ]
  },
  [
    "h",
    "i",
    "j"
  ]
]

.[]?配列やオブジェクト以外の項目を繰り返すときの苦情を防ぐには、イテレータフィルタのバージョンが必要です。.[]jq

正直なところ、.[][]ドキュメントのどこにも上記の形式(デフォルトでは:)の配列/オブジェクトイテレータフィルタへの直接的な言及はありません。あまり簡潔ではありませんが、明確に文書化されたバージョンは次のとおりです。

$ jq 'del(.[]? | .[]? | .[]? | .[]?)' ...

おすすめ記事