Json

限制jq的輸出深度

  • July 29, 2020

我想使用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這樣做嗎?

將該del函式與.[]?數組/對象值迭代器相結合以刪除嵌套在第四層的任何鍵/值似乎給出了您正在尋找的結果:

$ 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(.[]? | .[]? | .[]? | .[]?)' ...

引用自:https://unix.stackexchange.com/questions/600866