在同一个数组上获取所有结果

朱亚雷兹格

我已经为此苦苦挣扎了几个小时,我很确定我遗漏了一些东西。

鉴于此 JSON:

[
{
  "LAST_JOB_POD":"gitlab-web-65-gwwwh",
  "STARTED_AT":"31-05-2018-18:18:48",
  "FINISHED":"false",
  "FIRST_INDEXED":"0",
  "LAST_INDEXED":"3143",
  "failed_projects":{
    "1082": "4:Deadline Exceeded, trace",
    "1273": "/opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/elasticsearch-transport-5.0.3/lib/elasticsearch/transport/transport/base.rb:201:in `__raise_transport_error'",
    "2492": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "3060": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)"
  }
},
{
  "LAST_JOB_POD":"gitlab-web-65-gwwwh",
  "STARTED_AT":"31-05-2018-18:18:48",
  "FINISHED":"false",
  "FIRST_INDEXED":"0",
  "LAST_INDEXED":"3143",
  "failed_projects":{
    "5570": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6103": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6188": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6695": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6721": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6728": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6747": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)"
  }
},
{ 
  "LAST_JOB_POD":"gitlab-web-65-gwwwh",
  "STARTED_AT":"31-05-2018-18:18:48",
  "FINISHED":"false",
  "FIRST_INDEXED":"0",
  "LAST_INDEXED":"3143",
  "failed_projects":{
    "6760": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6939": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6941": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6942": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6947": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "7201": "/opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/elasticsearch-transport-5.0.3/lib/elasticsearch/transport/transport/base.rb:201:in `__raise_transport_error'",
    "7707": ", trace - [\"/opt/gitlab/embedded/service/gitlab-rails/ee/lib/gitlab/elastic/indexer.rb:64:in `run_indexer!'\"",
    "7787": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)"
  }
}
]

我目前正在使用jq提取failed_projects条目,但与

[] | select(.failed_projects != null) | . as $object | {"failed_projects"}[]

我得到了不同组的结果:

{
"1082": "...",
...
}
{
"5570": "...",
...
}
{
"6760": "...",
...
}

我想要完成的是将具有相同异常的 ID 分组。例如:

[{
"Exception": "ReadTimeout",
 [{
   "ID": 2492,
   "ID": 3060
 }]
},
{
"Exception": "Deadline Exceeded",
 [{
   "ID": 1082
 }]
}]
顶峰

说明性输出作为 JSON 无效并且具有重复键的对象,这可能不是您真正想要的,但以下 jq 程序将产生符合一般问题描述的输出。由于您似乎没有指定精确的分组标准,因此我将最后一个“:”之后的错误消息文本作为分组标准。(例如,如果您想考虑第一个“:”之后的文本,请使用“^[^:]*: *”作为正则表达式。)

第一步收集.failed_projects并应用,to_entries以便我们可以轻松访问 ID 和错误消息文本:

[.[] | .failed_projects | to_entries[]]

接下来我们提取分组标准,并使用它来形成组:

| map(.value |= sub("^.*: *";""))
| group_by(.value)

最后,我们将组转换为以下形式的 JSON 对象:{GROUP: ARRAY_OF_IDs}:

| map( .[0].value as $key
       | [.[] | .key] as $value
       | {($key): $value} )

将上述片段放在一个文件 program.jq 中,并使用调用:

jq -f program.jq input.json

产生如下所示的输出。您显然希望修改分组标准。您可能还希望将 ID 字符串转换为 JSON 数字,这可以tonumber通过(tonumber? // .).

要理解 program.jq,您可能希望从第一个片段开始,然后依次添加其他每个片段。

输出

[
  {
    "Deadline Exceeded, trace": [
      "1082"
    ]
  },
  {
    "TimeoutError)": [
      "6728",
      "6747",
      "6939",
      "5570",
      "6103",
      "6188",
      "6695",
      "6721",
      "2492",
      "6760",
      "3060",
      "6941",
      "6942",
      "6947",
      "7787"
    ]
  },
  {
    "in `__raise_transport_error'": [
      "1273",
      "7201"
    ]
  },
  {
    "in `run_indexer!'\"": [
      "7707"
    ]
  }
]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将一个数组的所有对象按键加入同一个数组

将一列的所有元素放入同一个数组(postgresql)

如果数组内有 isset ID,从同一个数组中定义的 ID 获取值?

在同一个数组字段上应用多个更新运算符

JS:为什么数组的所有元素似乎共享同一个参考点?

使用纯JavaScript从同一个类的所有div获取价值

如何在同一个基类的方法中获取所有属性?

在同一个类的所有元素上应用 ::after

Linux上的所有tmpfs实例都共享同一个内存池吗?

所有进程运行在同一个内核上

在laravel中如何在没有where条件的情况下获取同一个数组中的连接表数据

将多个数据发送到同一个数组

android上的同一个数据库是否可以有多个文件dao?

$lookup 在数组中的 ObjectId 并将其投影到同一个数组

如何从一个数组中的所有标签获取所有文本?

我怎样才能通过同一个班级的班级名称获取所有元素?

在多维数组中查找 aa 值,并从同一个数组中返回一个值

如何使用Mongodb将同一个名称的文档归为一个数组中的特定属性具有不同值的同名文档?

获取除第一个数组外的所有数组

从另一个数组内的数组中获取所有值

打印同一个数组,在不同的函数中是不同的,为什么呢?

两个数组元素通过php保存在同一个表中

如何确定在同一个数组中是否存在重复值?

尝试在同一个数组中添加数字

Elasticsearch 将范围和术语连接到同一个数组项

为什么同一个数组不相等?

React fetch 在同一个数组下发布多个值

如何在同一个数组下创建多个映射

firestore 规则和批量写入同一个数组