【问题标题】:Sort descending by multiple keys in jq在jq中按多个键降序排序
【发布时间】:2016-06-03 02:11:47
【问题描述】:

我有以下数组:

[{
    "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

【问题讨论】:

    标签: json sorting jq


    【解决方案1】:

    在 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)'
    

    【讨论】:

    • 如果prop1不是数字,那么explode可以这样使用jq 'sort_by((.prop1 | explode | map(-.)), .prop2)'
    猜你喜欢
    • 2021-09-29
    • 2020-12-23
    • 2022-10-15
    • 2018-03-29
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多