【问题标题】:Removing a key from parent object with jq使用 jq 从父对象中删除键
【发布时间】:2017-10-30 20:38:53
【问题描述】:

我刚刚在玩JQ, a JSON command line tool。我找不到可以帮助我解决相对简单问题的资源。

用例是我的 JSON 文件包含各种我不需要的额外内容(超过 500mb),如果我可以杀死特定密钥的数据,它会将其减少到近 1mb。

假设我有以下 JSON:

{
  "pages": {
    "elems": { ... stuff ... }
  },
  "actions": {
    "pages": { ... stuff ... }
  }
}

我会运行什么样的命令来删除第一级 pages 整个对象和键,但保留较低级别的 pages 原样?

预期输出:

{
  "actions": {
    "pages": { ... stuff ... }
  }
}

我试过跑步:jq -c 'del(.pages)' myfile.json >outputfile.json 但它似乎也破坏了所有名为 pages 的子键,导致类似:

{
  "actions": {}
}

任何帮助将不胜感激。

【问题讨论】:

  • 在 jq 1.5 上运行良好。无法还原
  • 也适用于 jq 1.3 和 jq 1.4 (!)

标签: json command-line jq


【解决方案1】:

我相信您最初的尝试应该按预期进行。这是我尝试后得到的结果:

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

Try it online at jqplay.org

要删除所有页面,您需要类似

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

Try it online at jqplay.org

【讨论】:

  • 如果键有连字符,那么像这样的东西需要是一个jq 'del(.["log-driver"])
  • 除了 jq 'del(.k1)|del(.k2)|del(.k3)' 之外,有没有办法从对象中删除多个键,即只使用 1 个 del 调用?
【解决方案2】:

由于您的输入文件非常大,因此可能值得使用 jq 1.5 的流解析器:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    相关资源
    最近更新 更多