我们正在使用Pentaho CTools库构建一个网站,该库有一个图形化的仪表板编辑器,可以为仪表板的一部分写出JSON格式的文件。
我想在签入git之前对这些文件应用转换,以便按键对它们进行排序,然后按某些键的值进行排序。目的是使差异更容易,因为编辑习惯重新安排所有的json字段。
例如,我们可能会有这样的事情:
{
"components": {
"rows": [
{
"id": "CHARTS",
"name": "Charts",
"parent": "UnIqEiD",
"properties": [
{
"name": "Group",
"type": "Label",
"value": "Charts"
}
],
"type": "Label",
"typeDesc": "<i>Group</i>"
},
{
"id": "kjalajsdjf",
"meta_cdwSupport": "true",
"parent": "CHARTS",
"properties": [
{
"name": "name",
"type": "Id",
"value": "Value1"
},
{
"name": "title",
"type": "String",
"value": "Value2"
},
{
"name": "listeners",
"type": "Listeners",
"value": "[]"
},
...
我们可以jq --sort-keys
(http://stedolan.github.io/jq/)对所有键进行排序,但我很难找到如何使用sort_by
函数对某些特定元素进行排序通过某些键的值(因此,在上面的示例中,按properties.name
排序。例如。任何想法?
答案 0 :(得分:46)
在IRC频道提供一些帮助后,我找到了答案。
基本上,它看起来像这样:
> jq '.components.rows|=sort_by(.id)|.components.rows[].properties|=sort_by(.name)' file.json > out.json
所以你选择正确的对象,在需要的时候进入数组,然后sort_by只取一个值(我试图sort_by(.components.rows.id)
失败了。)
| =而不是|传递值而不是剥离它们。
答案 1 :(得分:1)
如果要按属性对文件排序,此命令可能会有用:
jq -S '.' "$file" > "$file"_sorted;