从 jq json 输出中排除列

Exclude column from jq json output

我想使用 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

如果您只想删除时间戳,可以使用 del() 函数:

jq 'del(.[].timestamp)' input.json

然而,为了获得所需的输出,我不会使用 del() 函数。因为您知道哪些字段应该出现在输出中,您可以简单地用 groupid 填充一个数组,然后使用 join() 函数:

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

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

输出:

employees,elgalu
employees,mike
services,pacts

郑重声明,另一种选择是:

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

(白名单方式方便重新排列顺序,这种变体方便修改间距等)

想要安全 CSV 的任何人(即,即使值中嵌入了逗号或换行符)可能会对以下示例感兴趣:

$ jq -r '.[] | [.uid, .group] | @csv' input.json
"elgalu","employees"
"mike","employees"
"pacts","services"

Sed 是您最好的朋友 - 我想不出比它更简单的了。我来到这里遇到了与问题作者相同的问题 - 但也许这是对同一问题的更简单的答案:

< file sed -e '/timestamp/d'