2016-02-21 21 views
8

Mam następującą tablicę:JQ Sortuj malejąco według wielu kluczy

[{ 
    "name": "Object 1", 
    "prop1": 5, 
    "prop2": 2 
}, { 
    "name": "Object 2", 
    "prop1": 6, 
    "prop2": 4 
}, { 
    "name": "Object 3", 
    "prop1": 5, 
    "prop2": 3 
}] 

Chcę uporządkować tę tablicę analogiczną do tej SQL "ORDER BY PROP1 DESC, prop2 ASC", więc mam ten wynik:

[{ 
    "name": "Object 2", 
    "prop1": 6, 
    "prop2": 4 
}, { 
    "name": "Object 1", 
    "prop1": 5, 
    "prop2": 2 
}, { 
    "name": "Object 3", 
    "prop1": 5, 
    "prop2": 3 
}] 

Jak mogę posortować tablicę a) malejąco klawiszem i b) wieloma klawiszami?

Wersja: JQ 1.5

Odpowiedz

8

W JQ, tablice sortować według sortowania elementów one zawierać, w porządku. To jest:

$ jq -n '[1, 2] < [1, 3], [1, 2] < [2, 1]' 
true 
true 

Filtr sort_by sortuje tablicę, biorąc ekspresji jako argumentu, które zostaną ocenione dla każdego elementu macierzy. Na przykład, jeśli chcesz, aby posortować listę słów o długości:

$ jq -n '["prop", "leo", "column", "blast"] | sort_by(length)' 
[ 
    "leo", 
    "prop", 
    "blast", 
    "column" 
] 

Jeśli wyrażenie podane do sort_by jako argument zwraca więcej niż jedną wartość, wartości powrotne zostaną niejawnie zawinięte w tablicy, która będzie podlega regułom sortowania macierzy, o których mowa powyżej. Na przykład, jeśli chcesz, aby posortować listę słów według długości, a następnie alfabetycznie:

$ jq -n '["pro", "leo", "column", "ablast"] | sort_by(length, .)' 
[ 
    "leo", 
    "pro", 
    "ablast", 
    "column" 
] 

Wiedząc o tym, a także biorąc pod uwagę, że wartości w swoim przykładem są numeryczne, wystarczy wykonać następujące czynności:

$ jq 'sort_by(-.prop1, .prop2)'