在 Bash 中使用 jq 按值的降序对对象属性进行排序

Mik*_*kel 6 sorting bash json key jq

我有以下 JSON 片段:

{
    "root_path": "/www",
    "core_path": "/www/wp",
    "content_path": "/www/content",
    "vendor_path": "/www/vendor"
}
Run Code Online (Sandbox Code Playgroud)

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

/www/content
/www/vendor
/www/wp
/www
Run Code Online (Sandbox Code Playgroud)

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

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

{
    "/www": "root_path".
    "/www/wp": "core_path",
    "/www/content": "content_path",
    "/www/vendor": "vendor_path"
}
Run Code Online (Sandbox Code Playgroud)

对于第二个查询,我的用例是能够查找匹配的路径值并找到其路径名,然后我将在具有相同架构的第二个 JSON 片段中使用它来获取命名路径的值。

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

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

我正在使用jq版本1.5

pea*_*eak 16

按长度降序排列的值:

[.[]] | sort_by(length) | reverse[]
Run Code Online (Sandbox Code Playgroud)

交换值的属性

with_entries(.key as $k | .key=.value | .value=$k )
Run Code Online (Sandbox Code Playgroud)

结合这两个要求

一种解决方案将合并的问题可以通过组合上述两种解决方案来制作,因为with_entries是的组合to_entriesfrom_entries

to_entries
| map(.key as $k | .key=.value | .value=$k )
| sort_by(.key|length)
| reverse
| from_entries
Run Code Online (Sandbox Code Playgroud)