gpt4 book ai didi

json - 将 jq 查询的结果聚合到单个数组中

转载 作者:行者123 更新时间:2023-12-04 01:42:07 27 4
gpt4 key购买 nike

我有一个具有独立 JSON 对象(即不是数组)的输入文件,我想从每个对象中过滤一些字段并使用结果元素创建一个数组。它基本上是 JSON 格式的日志语句列表。

我正在使用 jq为此,它工作得很好,除了我无法将所有结果对象聚合到一个数组中。

输入是这样的:

{"name":"myname", "environment":"staging", "email":"email1@example.com", "time":"2017-04-02T05:00:00.046Z"}
{"name":"myname", "environment":"staging", "email":"email2@example.com", "time":"2017-02-02T05:00:00.046Z"}
...
{"name":"myname", "environment":"staging", "email":"email3@example.com", "time":"2017-10-02T05:00:00.046Z"}
{"name":"myothername", "environment":"staging", "time":"2017-10-02T05:00:00.046Z"}

(请注意,最后一个条目没有 email 字段,因此如果未过滤,它将返回 null 值)

从这个对象列表中,我只想获取字段 emailtime ,并忽略其余部分,所以我使用了以下 jq询问:
jq '{email: (.email | values), time: (.time | values)}' input.json
请注意,我使用了 values过滤器,因为日志消息是混合的,所以不是所有的 json 对象都有 email场,所以我忽略了那些。

我现在的问题是,即使我得到了想要的结果,我又得到了一个列表,我想要一个数组。

IE。我得到类似的东西
{"email":"email1@example.com", "time":"2017-04-02T05:00:00.046Z"}
{"email":"email2@example.com", "time":"2017-02-02T05:00:00.046Z"}
...
{"email":"email3@example.com", "time":"2017-10-02T05:00:00.046Z"}

我希望它像:
[
{"email":"email1@example.com", "time":"2017-04-02T05:00:00.046Z"},
{"email":"email2@example.com", "time":"2017-02-02T05:00:00.046Z"},
...,
{"email":"email3@example.com", "time":"2017-10-02T05:00:00.046Z"}
]

我尝试了几种不同的方法,但通常以错误告终 Cannot index array with string "email"这告诉我数组操作有问题。

我尝试将查询包装在 map() 中,即 map({.userEmail, .time}) ,尝试使用 -s 获取数据我尝试使用 |+|=运营商。

我还尝试将查询包裹在数组括号内,如 [{email: (.email|values), time:.time }] ,但我得到相同的结果对象,除了它们中的每一个都单独包装在一个数组中,即
[{"email":"email1@example.com", "time":"2017-04-02T05:00:00.046Z"}]
[{"email":"email2@example.com", "time":"2017-02-02T05:00:00.046Z"}]
...
[{"email":"email3@example.com", "time":"2017-10-02T05:00:00.046Z"}]

看起来这可能是一件容易的事情,或者至少是一个常见的操作,但我没有找到正确的查询。

那么,当输入不是数组时,将查询结果聚合到数组中的正确方法是什么?

最佳答案

甚至更好...

  • 根据您的样本数据,您的基本过滤器可以简化为 {email, time}
  • 一般来说,最好避免“slurping”输入(例如为了节省内存)。这可以通过使用 inputs 在您的情况下完成。使用 -n 命令行选项。

  • 把它们放在一起:
    jq -n '[inputs | {email, time }]' input.json

    如果你想过滤掉一些输入,你可以使用 select ,例如
    jq -n '[inputs | select(.email) | {email, time } ]' input.json

    关于json - 将 jq 查询的结果聚合到单个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56909701/

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