2017-09-21 2 views
0

Ich habe eine Datei mit folgendem Format:Wie verwende ich jq, um ein bestimmtes Element in einem JSON-Array auszuwählen, dessen Reihenfolge sich ständig ändert?

{

"files":[ 
     { 
     "BLOCK1":{ 
      "SUBBLOCK1":{ 
       "akey1":"avalue1", 
       "bkey1":"bvalue1", 
       "ckey1":"cvalue1" 
      }, 
      "dkey1":"dvalue1", 
      "key":"evalue1" 
     } 
     }, 
     { 
     "BLOCK-2":{ 
      "SUBBLOCK2":{ 
       "akey2":"avalue2", 
       "bkey2":"bvalue2" 
      }, 
      "ckey2":"cvalue2", 
      "key":"dvalue2" 
     } 
     }, 
     { 
     "BLOCK-A":{ 
      "SUBBLOCKA":{ 
       "akeyA":"avalueA", 
       "bkeyA":"bvalueA" 
      }, 
      "ckeyA":"cvalueA", 
      "key":"dvalueA" 
     } 
     }], 
    "NOBLOCK":"value", 
    "key":"NOBLOCKvalue" 
} 

ich folgendes die jq Aussage bin mit "bvalueA" zu isolieren:

value=$(jq -r '.files | .[2] | .["BLOCK-A"].SUBBLOCKA.bkeyA' jqtest) 

Welche ganz gut funktioniert. Aber die Datei ändert die Reihenfolge jede Nacht. Also könnte BLOCK-A eine Nacht das Element 0 sein, 1 die nächste, und so weiter. Wie kann ich jq ändern, um immer auf BLOCK-A zu bohren, egal welches Element im Array es ist?

Antwort

1

Sie suchen select():

jq -r '.files[]|select(.["BLOCK-A"])|.["BLOCK-A"].SUBBLOCKA.bkeyA' 

oder map():

jq -r '.files|map(.["BLOCK-A"]//empty)[].SUBBLOCKA.bkeyA' 
0

Der alternative Ansatz mit has() Funktion:

jq -r '.files[] | if (has("BLOCK-A")) then .["BLOCK-A"].SUBBLOCKA.bkeyA else empty end' jqtest 
bvalueA 
0

Hier ist eine Lösung auf Basis von my previous answer auf Ihre vorhin Frage:

$ jq -M ' 

def getfile($k): .files[] | select(keys[] == $k) | .[$k]; 

getfile("BLOCK-A").SUBBLOCKA.bkeyA 

' jqtest 

Mit den Beispieldaten der Ausgang vorgesehen ist:

"bvalueA" 
2

Dies könnte die wenigsten Tastenanschläge Lösung sein:

.files[]."BLOCK-A"//empty|.SUBBLOCKA.bkeyA 

Wenn es eine Möglichkeit gibt, dass es mehr ist als ein "BLOCK-A" -Element, und wenn Sie sicherstellen möchten, dass alle bis auf die erste ignoriert werden, wenn dies der Fall ist, können Sie das oben genannte in einen Anruf an first/1 umhüllen, Ihre Version vorausgesetzt n von jq hat es: erste (...)

Mit first auf diese Weise ergibt auch eine effizientere Lösung.

+0

Ich hatte gehofft, dass Sie hier antworten. – hek2mgl

Verwandte Themen