Bash jq-使用map函数保留属性的当前排序顺序

Bash jq-使用map函数保留属性的当前排序顺序,bash,shell,jq,Bash,Shell,Jq,我将以下JSON命名为my.JSON 我正试图了解map函数在jq 1.3版中的用法 稍后,我打算将此逻辑(即映射函数)用于复杂的jq过滤器,以保留每个对象中属性的当前排序顺序,因为--sort key选项在jq 1.3版中不可用 我的目标是在使用map函数后按原样输出My.json文件的内容 到目前为止,我已经根据这些答案和建议提出了以下jq命令 这给了我以下输出 [ [ { "action": "copy" },

我将以下JSON命名为my.JSON

我正试图了解map函数在jq 1.3版中的用法

稍后,我打算将此逻辑(即映射函数)用于复杂的jq过滤器,以保留每个对象中属性的当前排序顺序,因为--sort key选项在jq 1.3版中不可用

我的目标是在使用map函数后按原样输出My.json文件的内容

到目前为止,我已经根据这些答案和建议提出了以下jq命令

这给了我以下输出

[
  [
    {
      "action": "copy"
    },
    {
      "artifact_location": "one foo one"
    }
  ],
  [
    {
      "action": "copy"
    },
    {
      "artifact_location": "one bar one"
    }
  ],
  [
    {
      "action": "remove"
    },
    {
      "artifact_location": "two foo two"
    }
  ]
]
如果我组合添加功能,如下所示

jq -r 'map(to_entries | map({(.key): .value}) | add )' my.json
更改先前排序的属性顺序,类似于下面的输出

[
  {
    "artifact_location": "one foo one",
    "action": "copy"
  },
  {
    "artifact_location": "one bar one",
    "action": "copy"
  },
  {
    "artifact_location": "two foo two",
    "action": "remove"
  }
]

我在这里遗漏了什么?

JQ1.3不保证对象中键的顺序。其实就这么简单,尽管
map
本身与您注意到的重新排序无关

还要记住,jq的版本非常古老,应该被认为是过时的


但是,在jq 1.3的范围内,您可能可以做任何您真正想做的事情,但是任何重新排序的键的示例都将说明前面的一点。

jq 1.3不保证对象中键的顺序。其实就这么简单,尽管
map
本身与您注意到的重新排序无关

还要记住,jq的版本非常古老,应该被认为是过时的


但是,在jq 1.3的范围内,您可能可以做任何您真正想做的事情,但是任何重新排序的键的示例都将说明前面的一点。

感谢您的解释。我已经决定迁移到最新版本,因为我没有其他选择。谢谢你的解释。我已经决定迁移到最新版本,因为我没有其他选择。
jq -r 'map(to_entries | map({(.key): .value}) | add )' my.json
[
  {
    "artifact_location": "one foo one",
    "action": "copy"
  },
  {
    "artifact_location": "one bar one",
    "action": "copy"
  },
  {
    "artifact_location": "two foo two",
    "action": "remove"
  }
]