从 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() 函数。由于您知道哪些字段应该出现在输出中,您可以简单地使用groupid 填充一个数组,然后使用join() 函数:

jq -r '.[]|[.group,.uid]|join(",")' input.json

-r 代表原始输出jq 不会在值周围打印引号。

输出:

employees,elgalu
employees,mike
services,pacts

【讨论】:

很好的答案!此外,如果您要在 CSV 上使用它,请考虑使用 @csv 过滤器而不是 joining。 相关,选择多个路径表达式删除我们可以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输出中获取数据

使用“jq”从 JSON 文件导出所需的输出(按正确顺序的字段)

为啥 jq --raw-output 参数无法从 @csv 输出中删除引号?

使用 Jq 展平 JSON,并在输出中使用数组索引

jq 以 JSON 格式输出结果

无法使用 jq 将 JSON 输出转换为 CSV 格式