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

时间:2018-08-19 03:54:38

标签: json bash sorting key jq

我有以下JSON代码段:

{
    "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代码片段中,以获取命名路径的值。

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

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

我正在使用jq1.5

1 个答案:

答案 0 :(得分:3)

  

这些值以长度的降序排列:

[.[]] | 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
相关问题