【发布时间】:2019-07-05 22:10:24
【问题描述】:
我有一个包含独立 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 值)
从此对象列表中,我只想获取字段email 和time,而忽略其余字段,因此我使用了以下jq 查询:
jq '{email: (.email | values), time: (.time | values)}' input.json
请注意,我使用 values 过滤器是因为日志消息是混合的,所以并非所有 json 对象都有 email 字段,所以我忽略了这些。
我现在的问题是,即使我得到了想要的结果,我又得到了一个列表,我想要一个数组。
即我得到类似的东西
{"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"}]
看起来这可能是一件容易的事,或者至少是一个常见的操作,但我找不到正确的查询。
当输入不是数组时,将查询结果聚合到数组中的正确方法是什么?
【问题讨论】: