gpt4 book ai didi

json - JQ排序键任意顺序

转载 作者:行者123 更新时间:2023-12-05 06:37:57 24 4
gpt4 key购买 nike

我正在尝试以任意格式按键排序(键“事件”应该是第一个)

我知道这个按字母顺序对键进行排序:jq -S '.'文件.json

但是是否有一个函数可以对键进行排序,以便第一个始终相同而不是按字母顺序排列?

这是为了让它们更具可读性,并且最重要的键在前

目前有:{key1:value, shouldbeFirstKey:value2, ...}想{shouldbeFirstKey:value2, key1:value, ...}

最佳答案

假设我们有一个带有一堆键的对象,并希望其中一些键按特定顺序出现,而其他键保持原样。然后可以使用以下示例说明的技术:

$ jq -n '{a:2,b:3,first:0,second:1} | . as $in | {first,second} + $in'

结果:

{
"first": 0,
"second": 1,
"a": 2,
"b": 3
}

重新加密

让我们将定义键顺序的对象称为“模板对象”(上面的 {first,second})。请注意,使用上述技术,“模板对象”中的键总是出现在结果中。如果我们只希望模板对象键出现在输入中时出现在结果中,我们可以使用以下函数修改上述方法:

def rekey(obj):
. as $in
| reduce (obj|keys_unsorted)[] as $k ({};
if $in|has($k) then . + {($k): $in[$k]} else . end)
| . + $in ;

例如:

{a:2,b:3,first:0,second:1} | rekey({first,second,third})

产生:

{
"first": 0,
"second": 1,
"a": 2,
"b": 3
}

使用walk/1

如果想递归地重新排序键,可以使用 walk/1 (定义为 https://github.com/stedolan/jq/blob/master/src/builtin.jq ),如此处使用 rekey 的上述定义所示:

walk(if type == "object" then rekey($template) else . end)

其中 $template 表示“模板对象”。

不需要定义walk/1 的特殊变体。只需定义一个函数,该函数将任意对象作为输入,并产生所需的重新排序。

(如果你的jq自带的walk/1版本使用了keys,那么你应该考虑更新你的jq,或者重新定义walk/1 使用 keys_unsorted。)

关于json - JQ排序键任意顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46796701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com