2017-05-25 55 views
1

我有以下數據集:你如何排除財產?

[ 
    { 
    "py/object": "bit.ast.Node", 
    "_children": [ 
     { 
     "py/object": "bit.ast.Node", 
     "_children": [ 
      "main", 
      { 
      "py/object": "bit.ast.Node", 
      "_children": [ 
       "args", 
       { 
       "py/object": "bit.ast.Node", 
       "_children": [ 
        { 
        "py/object": "bit.ast.Node", 
        "_children": [ 
         "str" 
        ], 
        "source_column": 2, 
        "source_filename": "tests/fixture/hello.b", 
        "source_line": 1, 
        "tag": "type-named" 
        } 
       ], 
       "base": { 
        "py/id": 10 
       }, 
       "source_column": 2, 
       "source_filename": "tests/fixture/hello.b", 
       "source_line": 1, 
       "tag": "type", 
       "type": "array" 
       } 
      ], 

(等等...)

我怎麼jq排除該有它的所有對象的_children財產?以_開頭的所有房產呢?

以下的無似乎工作:

jq 'map(del (._children))' 
jq 'map(if has("_children") then del (._children) end)' 
jq 'del(._children)' 
jq 'del(.[]._children)' 
jq 'del(.[]|._children)' 

我不斷收到類似的錯誤:

jq: error (at <stdin>:1): Cannot index string with string "_children" 
+0

請提供JSON的*完整*樣品可以用作輸入。 – chepner

+0

@chepner我擁有的東西足以滿足我的用例。 – Qix

+0

@Qix - 如果沒有看到更多的輸入信息,就很難確定報告錯誤的原因。 – peak

回答

1

排除有它

所有對象_children財產

如果您的jq有walk/1那麼您可以:

walk(if type == "object" then del(._children) else . end) 

如果不是,首先包括其jq定義(易於googleable)例如in〜/ .jq

以_開頭的所有屬性怎麼樣?

爲此,您也可以使用walk/1。爲了清晰和可維護性,這將是有意義的定義一個輔助函數:

def deleteall(f): with_entries(select(.key | f | not)); 

,你會調用爲:deleteall(startswith(「_」))

+0

整潔:)謝謝! – Qix