を使用して任意の文書を閲覧したい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(.[]? | .[]? | .[]? | .[]?)' ...