2015-02-19 13 views
9

Ho un file JSON people.json:JQ Filtro sulla sub valore di oggetto

{ 
    "Joe" : {"Job" : "Clown", "Age" : 22}, 
    "Sally" : {"Job" : "Programmer", "Age" : 32}, 
    "Anne" : {"Job" : "Clown", "Age" : 29} 
} 

Vorrei selezionare tutti coloro che sono un clown. La mia uscita dovrebbe essere simile a questo:

{ 
    "Joe" : {"Job" : "Clown", "Age" : 22}, 
    "Anne" : {"Job" : "Clown", "Age" : 29} 
} 

Ho provato il .. operatore in

cat people.json | jq '. | map(select(.Job == "Clown"))' 

ma sembra corrispondere Joe e Anne a più livelli e produce più di uscita poi voglio. Qualche idea? Grazie.

risposta

14

uso with_entries per convertire da/a un formato intermedio che rappresenta i dati come un array di oggetti con key e value elementi:

cat people.json | jq 'with_entries(select(.value.Job == "Clown"))' 

secondo la documentazione qui: http://stedolan.github.io/jq/manual/

1

Ecco la soluzione utilizzando ridurre

. as $v 
| reduce keys[] as $k (
    {}; 
    if $v[$k].Job == "Clown" then .[$k] = $v[$k] else . end 
) 
Problemi correlati