【问题标题】:Merge and Sort JSON using JQ使用 JQ 合并和排序 JSON
【发布时间】:2020-04-13 22:27:08
【问题描述】:

我有一个包含以下结构和未知数量结果的文件:

{
"results": [
      [
         {
            "field": "AccountID",
            "value": "5177497"
         },
         {
            "field": "Requests",
            "value": "50900"
         }
      ],
      [
         {
            "field": "AccountID",
            "value": "pro"
         },
         {
            "field": "Requests",
            "value": "251"
         }
      ]
   ],
   "statistics": {
      "Matched": 51498,
      "Scanned": 8673577,
      "ScannedByte": 2.72400814E10
   },
   "status": "HOLD"
}
{
"results": [
      [
         {
            "field": "AccountID",
            "value": "5577497"
         },
         {
            "field": "Requests",
            "value": "51900"
         }
      ],
   "statistics": {
      "Matched": 51498,
      "Scanned": 8673577,
      "ScannedByte": 2.72400814E10
   },
   "status": "HOLD"
}

有多个这样的结果被索引为带有结果文件夹的数组。它们不是用逗号分隔的。

我正在尝试使用 jq 在 ZSH 中打印按“请求”排序的“帐户 ID”。我尝试将它们展平并使用:

jq -r '.results[][0] |.value ' 文件名

jq -r '.results[][1] |.value ' 文件名

分别获取帐户 ID 和请求并对其进行排序。我不认为 bash 有可以使用的字典。问题出在文件中,因为字段和值不是键值对,而是两个对。因此,使用上述两行将它们提取到单独的数组中并按第二个数组排序似乎有点太长了。我想知道是否有办法将这两种操作结合​​起来。 另一种方法是将它们全部组合成一个字符串并按升序排序。 Python 可能有最好的解决方案,但代码需要是 zsh 或 bash 脚本。

欢迎使用 sed、jq 或任何其他 ZSH 支持的编译器的解决方案。如果有办法在 bash 中创建字典,请告诉我。

预计的输出要求只是帐户 ID 与请求编号。

5577497 has 51900 requests
5177497 has 50900 requests
pro has 251 requests

【问题讨论】:

  • 请遵循minimal reproducible example 准则。由于该文件包含 JSON 对象流,因此提供具有两个此类对象的示例是有意义的。如果有帮助,可以同时包含(小)有效样本以及可能不是有效 JSON 的有效流的指示性说明。

标签: json jq


【解决方案1】:

如果你不介意学一点 jq,最好写一个小的 jq 程序来做你想做的事。

为帮助您入门,请考虑以下 jq 程序,该程序假定您的输入是一个有效 JSON 对象流,其“结果”键与您的示例类似:

[inputs | .results[] | map( { (.field) : .value} ) | add]

在对您的输入进行细微更改使其包含有效的 JSON 对象后,使用 -n 选项调用 jq 会生成一个 AccountID/Requests 对象数组:

[
  {
    "AccountID": "5177497",
    "Requests": "50900"
  },
  {
    "AccountID": "pro",
    "Requests": "251"
  },
  {
    "AccountID": "5577497",
    "Requests": "51900"
  }
]

您现在可以(例如)使用 jq 的 group_by 按 AccountID 对这些对象进行分组,从而产生您想要的结果。

【讨论】:

  • 我已经用 JQ 做的事情也做了同样的事情。但是在你的命令下。我可以一步到位。 list=$(jq -r '.results[] | map( { (.field) : .value} ) | add ' query-results-aggregate)
【解决方案2】:
jq -S '.results[] | map( { (.field) : .value} ) | add' query-results-aggregate \
  | jq -s -c 'group_by(.number_of_requests) | .[]'

这可以解决问题。感谢 peak 的指导。

【讨论】:

  • 不需要两次调用jq!
猜你喜欢
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 2019-07-07
  • 2017-08-29
  • 2021-07-21
相关资源
最近更新 更多