有人知道如何使用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
但是它仅对键进行排序,而不包括键的值。
谢谢!
答案 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条目。然后,对其余的(行进)数组重复相同的过程。