2016-09-30 33 views
3

在非常大的嵌套json結構中,我試圖找到所有以鍵結尾的路徑。如何使用jq查找某個鍵的所有路徑

例如:

{ 
    "A": { 
    "A1": { 
     "foo": { 
     "_": "_" 
     } 
    }, 
    "A2": { 
     "_": "_" 
    } 
    }, 
    "B": { 
    "B1": {} 
    }, 
    "foo": { 
    "_": "_" 
    } 
} 

將打印線沿線的東西: [ 「A」, 「A1」, 「富」],[ 「富」]


不幸的是我不知道在什麼級別的嵌套鍵會出現,所以我一直沒有能夠找出一個簡單的選擇。我已經接近jq '[paths] | .[] | select(contains(["foo"]))',但輸出包含任何包含foo的樹的所有排列。 輸出:["A", "A1", "foo"]["A", "A1", "foo", "_"]["foo"][ "foo", "_"]

如果我可以保留原始數據結構格式,但只是過濾掉所有不含密鑰的路徑(在這種情況下,「foo」下的子樹不需要隱藏)。

+0

如何用'endswith'更換'contains'? –

回答

4

有了您的輸入:

$ jq -c 'paths | select(.[-1] == "foo")' 
["A","A1","foo"] 
["foo"] 

加分點:

(1)如果你的JQ有tostream

$ jq 'fromstream(tostream| select(.[0]|index("foo")))' 

或者更好的,因爲你的投入很大,你可以使用帶有此過濾器的流解析器(jq -n --stream):

fromstream(inputs|select((.[0]|index("foo")))) 

(2)無論您的JQ有tostream

. as $in 
| reduce (paths(scalars) | select(index("foo"))) as $p 
    (null; setpath($p; $in|getpath($p)))) 

在所有這三種情況下,輸出是:

{ 
    "A": { 
    "A1": { 
     "foo": { 
     "_": "_" 
     } 
    } 
    }, 
    "foo": { 
    "_": "_" 
    } 
} 
相關問題