从 jq json 输出中排除列
Posted
技术标签:
【中文标题】从 jq json 输出中排除列【英文标题】:Exclude column from jq json output 【发布时间】:2016-02-26 23:28:15 【问题描述】:我想在这里使用jq JSON 处理器去掉timestamp
字段。
[
"timestamp": 1448369447295,
"group": "employees",
"uid": "elgalu"
,
"timestamp": 1448369447296,
"group": "employees",
"uid": "mike"
,
"timestamp": 1448369786667,
"group": "services",
"uid": "pacts"
]
白名单也适用于我,即select uid, group
最终,我真正想要的是一个具有唯一值的列表,如下所示:
employees,elgalu
employees,mike
services,pacts
【问题讨论】:
【参考方案1】:如果您只想删除时间戳,可以使用del()
函数:
jq 'del(.[].timestamp)' input.json
但是,为了实现所需的输出,我不会使用 del()
函数。由于您知道哪些字段应该出现在输出中,您可以简单地使用group
和id
填充一个数组,然后使用join()
函数:
jq -r '.[]|[.group,.uid]|join(",")' input.json
-r
代表原始输出。 jq
不会在值周围打印引号。
输出:
employees,elgalu
employees,mike
services,pacts
【讨论】:
很好的答案!此外,如果您要在 CSV 上使用它,请考虑使用@csv
过滤器而不是 join
ing。
相关,选择多个路径表达式删除我们可以del(.[]["timestamp", "group"])
为什么不使用删除功能?与第二种选择相比,它更易于理解和处理更多案例。使用此选项的坏处是什么?因为我想使用它,因为每个对象中的键都可以是变量。
我认为如果要删除的字段数大于要保留的字段数,它会变得冗长。但是,您可以使用最适合您的方法【参考方案2】:
为了记录,另一种选择是:
$ jq -r '.[] | "\(.uid),\(.group)"' input.json
(白名单的方式可以很容易地重新排列顺序,而这种变体可以很容易地修改间距等)
任何想要安全 CSV 的人都可能会对以下示例感兴趣(即,即使值已嵌入逗号或换行符):
$ jq -r '.[] | [.uid, .group] | @csv' input.json
"elgalu","employees"
"mike","employees"
"pacts","services"
【讨论】:
白名单只有在您事先知道文档中有哪些字段时才有效,这是一个严重的限制。以上是关于从 jq json 输出中排除列的主要内容,如果未能解决你的问题,请参考以下文章
使用“jq”从 JSON 文件导出所需的输出(按正确顺序的字段)