如何解决jq:对对象值进行排序
我想通过对象键对数据结构进行排序(使用-S
很容易,并通过'foo'属性对对象值(数组)进行排序。
我可以对它们进行排序
jq -S '
. as $in
| keys[]
| . as $k
| $in[$k] | sort_by(.foo)
' < test.json
...但是丢失了钥匙。
我尝试了添加 | { "\($k)": . }
的变体,但是最后我得到了一个对象列表,而不是一个对象。我还尝试了添加$ in(相同问题)或使用$in = $in * { ... }
的变体,但这给了我语法错误。
我确实找到的一个解决方案是只具有单独的对象,然后将其通过管道传输到jq -s add
中,但是……我真的希望它以另一种方式工作。 :-)
下面的测试数据:
{
"": [
{ "foo": "d" },{ "foo": "g" },{ "foo": "f" }
],"c": [
{ "foo": "abc" },{ "foo": "def" }
],"e": [
{ "foo": "xyz" },"ab": [
{ "foo": "def" },{ "foo": "abc" }
]
}
解决方法
也许是吗?
jq -S '.[] |= sort_by(.foo)'
输出
{
"": [
{
"foo": "d"
},{
"foo": "f"
},{
"foo": "g"
}
],"ab": [
{
"foo": "abc"
},{
"foo": "def"
}
],"c": [
{
"foo": "abc"
},"e": [
{
"foo": "def"
},{
"foo": "xyz"
}
]
}
,
@ user197693有一个很好的答案。我在其他地方的私人消息中得到的建议是使用
jq -S 'with_entries(.value |= sort_by(.foo))'
,
如果出于某些原因,使用-S
命令行选项不是令人满意的选项,则还可以使用to_entries | sort_by(.key) | from_entries
惯用语执行按键排序。因此,解决该问题的完整方法是:
.[] |= sort_by(.foo)
| to_entries | sort_by(.key) | from_entries
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。