2015-11-24 9 views
9

Chciałbym pozbyć się tutaj pola timestamp przy użyciu procesora JSON jq.Wyklucz kolumnę z jq json output

[ 
    { 
    "timestamp": 1448369447295, 
    "group": "employees", 
    "uid": "elgalu" 
    }, 
    { 
    "timestamp": 1448369447296, 
    "group": "employees", 
    "uid": "mike" 
    }, 
    { 
    "timestamp": 1448369786667, 
    "group": "services", 
    "uid": "pacts" 
    } 
] 

biały aukcja będzie działa również dla mnie, czyli select uid, group

Ostatecznie co naprawdę chciałbym to lista z unikalnymi wartościami tak:

employees,elgalu 
employees,mike 
services,pacts 

Odpowiedz

16

Jeśli chcesz tylko usunąć znaczniki czasu można użyć funkcji del():

jq 'del(.[].timestamp)' input.json 

Jednak w celu osiągnięcia pożądanej wydajności nie używałbym funkcji del(). Ponieważ wiesz, które pola powinny pojawić się na wyjściu, wystarczy wypełnić tablicę z group i id a następnie użyć join() funkcję:

jq -r '.[]|[.group,.uid]|join(",")' input.json 

-r podpórek surowego ouput. jq nie będzie drukować cytatów wokół wartości.

wyjściowa:

employees,elgalu 
employees,mike 
services,pacts 
+3

Świetna odpowiedź! Co więcej, jeśli zamierzasz używać tego w pliku CSV, rozważ użycie filtru "@ csv" zamiast 'join'ing. –

+0

@SantiagoLapresta Dobry pomysł! Dziękuję za to! – hek2mgl

6

Dla przypomnienia, alternatywą byłoby:

$ jq -r '.[] | "\(.uid),\(.group)"' input.json 

(Podejście biało-wystawianie ułatwia zmienić kolejność, a ten wariant ułatwia zmodyfikuj odstępy, itd.)

Poniższy przykład może być interesujący dla każdego, kto chce mieć bezpieczny plik CSV (tj. nawet jeśli wartości zawierają osadzone przecinki lub znaki nowej linii):

$ jq -r '.[] | [.uid, .group] | @csv' input.json 
"elgalu","employees" 
"mike","employees" 
"pacts","services"