【问题标题】:Use jq in Bash to sort object properties by descending length of their value在 Bash 中使用 jq 按值的降序对对象属性进行排序
【发布时间】:2019-01-25 14:43:39
【问题描述】:

我有以下 JSON sn-p:

{
    "root_path": "/www",
    "core_path": "/www/wp",
    "content_path": "/www/content",
    "vendor_path": "/www/vendor"
}

我想先使用jq 来获取按长度降序排列的值:

/www/content
/www/vendor
/www/wp
/www

我需要这些,因此我可以匹配文件列表以查找文件存在于哪个命名路径中。

然后我想再次使用jq 来交换值的属性(它可以删除重复的属性,没关系):

{
    "/www": "root_path".
    "/www/wp": "core_path",
    "/www/content": "content_path",
    "/www/vendor": "vendor_path"
}

我对第二个查询的用例是能够查找匹配的路径值并找到它的路径名,然后我将在具有相同模式的第二个 JSON sn-p 中使用它来获取命名路径的值。

我的用例是用于网站部署,我有一个包含文件名的配置文件,因为它们将存在于部署服务器上,应该从源服务器复制到部署服务器,但服务器可能有不同的目录布局。

我需要为此使用 Bash,但如果有更好的方法来做我想做的事情,我是开放的。也就是说,我真的很想学习如何更好地使用jq,所以我更愿意学习如何使用jq 来进行这些转换。

我正在使用jq版本1.5

【问题讨论】:

    标签: json bash sorting key jq


    【解决方案1】:

    按长度降序排列的值:

    [.[]] | sort_by(length) | reverse[]
    

    用属性交换值

    with_entries(.key as $k | .key=.value | .value=$k )
    

    结合两个要求

    组合问题的解决方案可以通过组合上述两个解决方案来制作,因为with_entriesto_entriesfrom_entries 的组合:

    to_entries
    | map(.key as $k | .key=.value | .value=$k )
    | sort_by(.key|length)
    | reverse
    | from_entries
    

    【讨论】:

    • 你先生真棒!非常感谢你。现在我必须去研究它,试图弄清楚它是如何工作的。 (我希望我能更多地投票!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2023-04-03
    • 2016-02-08
    • 1970-01-01
    • 2021-07-20
    • 2013-05-21
    • 2010-11-02
    相关资源
    最近更新 更多