web-dev-qa-db-ja.com

jqの複数のキーで降順で並べ替える

私は次の配列を持っています:

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

このSQLに類似したこの配列をソートしたいORDER BY prop1 DESC, prop2 ASCだから私はこの結果を持っています:

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

配列をa)キーで降順、b)複数のキーで並べ替えるにはどうすればよいですか?

バージョン:jq ​​1.5

12

Jqでは、配列は、配列に含まれる要素の並べ替えによって順番に並べ替えられます。あれは:

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

sort_by フィルターは、配列の各メンバーに対して評価される式を引数として、配列をソートします。たとえば、単語のリストを長さで並べ替える場合は、次のようにします。

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

引数としてsort_byに指定された式が複数の値を返す場合、戻り値は暗黙的に配列にラップされ、上記の配列ソート規則に従います。たとえば、単語のリストを長さで並べ替えてからアルファベット順に並べ替える場合は、次のようになります。

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

これを理解し、例の値が数値であることを考慮に入れると、次のことができます。

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