使用jq对键进行排序,然后对json中的值进行排序

时间:2019-02-13 20:25:21

标签: json sorting key jq

有人知道如何使用jq在json中对键及其数组值进行排序吗?

例如:

排序前:

{ 
   z:["c","b","a"],
   y:["e", "d", "f"],
   x:["g", "i", "h"]
}

排序后:

{
   x:["h", "i", "j"]
   y:["d", "e", "f"],
   z:["a","b","c"]
}

我正在尝试使用

jq --sort-keys 

但是它仅对键进行排序,而不包括键的值。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您愿意依靠--sort-keys命令行选项对键进行排序,则可以通过以下方式确保对所有数组进行排序:

walk(if type=="array" then sort else . end)

如果要在内部对对象键进行排序(即在生成最终输出之前),则可以使用以下过滤器来增强上述内容:

walk(if type=="array" then sort
     elif type == "object" then to_entries | sort | from_entries
     else . end)

替代品

如果出于某种原因您不想使用walk,则可以使用sort(对于JSON数组)和to_entries|sort|from_entries(对于JSON对象)的组合来滚动自己的解决方案

答案 1 :(得分:0)

我也很想在这里提供替代解决方案:依靠我的 jtc 的另一个unix实用程序和一些标准的unix cli:

首先是示例,然后进行解释(假设您的json位于file.json中):

bash $ jtc -w[:] -eu echo {} \| jtc -rw[:] \| sort \| paste -s -d, - \| sed -E 's/(.*)/[\1]/g' \; file.json 
{
   "x": [
      "g",
      "h",
      "i"
   ],
   "y": [
      "d",
      "e",
      "f"
   ],
   "z": [
      "a",
      "b",
      "c"
   ]
}
bash $ 

说明:

1。 jtc默认对JSON对象中的键进行排序。步行路径-w[:]列出了顶级json节点(此处是对象)内的所有节点:

bash $ jtc -w[:] -r file.json 
[ "g", "i", "h" ]
[ "e", "d", "f" ]
[ "c", "b", "a" ]
bash $ 

2。 -u更新(替换)每个步行的条目,而-e让我们对步行的条目执行shell评估:像这样的jtc -w[:] -eu <...shell cli...> \; file.json。另外,{}的每个实例都将与遍历的条目进行插值。

因此,例如第一个步行条目([ "g", "i", "h" ])将被插值和评估,如下所示:

echo '[ "g", "i", "h" ]' | jtc -rw[:] | sort | paste -s -d, - | sed -E 's/(.*)/[\1]/g'
["g","h","i"]

其中:

  • jtc -rw[:]列出所有条目(在每一行上)
  • sort全部排序
  • paste -s -d, -通过逗号,将所有行污染成一行。
  • sed -E 's/(.*)/[\1]/g'将最粗的[]放在已排序的条目周围

3。结果json替换了外部jtc中的walked条目。然后,对其余的(行进)数组重复相同的过程。