使用jq从父对象中删除一个键

30
如何使用JQ排除一些项目?我的JSON内容中有一些我不需要的额外项目(超过500MB),如果我能够修剪它们,可以将其减少到1MB。
{
  "pages": {
    "elems": { ... stuff ... }
  },
  "actions": {
    "pages": { ... stuff ... }
  }
}

我想删除第一层级的"pages"整个对象和键,但保留较低层级的"pages"不变。期望输出:
{
  "actions": {
    "pages": { ... stuff ... }
  }
}

在 jq 1.5 上运行良好。无法复现。 - RomanPerekhrest
同样适用于 jq 1.3 和 jq 1.4 (!)。 - peak
2个回答

55

我相信你最初的尝试应该能够按预期工作。以下是我尝试时得到的结果:

$ jq 'del(.pages)' myfile.json
{
  "actions": {
    "pages": {
      "stuff": "..."
    }
  }
}

在 jqplay.org 上尝试在线演示

如果您想要删除所有页面,您需要类似于以下内容:

$ jq 'del(.. | .pages?)' myfile.json
{
  "actions": {}
}

在 jqplay.org 上在线尝试


如果键中有连字符,则需要像这样使用 jq 'del(.["log-driver"]) - vikas027
除了 jq 'del(.k1)|del(.k2)|del(.k3)' 这种方式,是否有一种方法可以仅使用一个 del 调用从对象中删除多个键? - Mike Lippert

0

鉴于您的输入文件相当大,使用 jq 1.5 的流解析器可能是值得的:

jq -n --stream '
  fromstream(inputs|select((length == 2 and .[0][0] == "pages")|not))
' input.json

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接