使用jq从父对象中删除密钥

时间:2017-10-30 20:38:54

标签: json command-line jq

我现在正在玩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": {}
}

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

我相信你原来的尝试应该按预期工作。这是我尝试时得到的结果:

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

Try it online at jqplay.org

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

的内容
$ jq -M 'del(.. | .pages?)' myfile.json
{
  "actions": {}
}

Try it online at jqplay.org

答案 1 :(得分:0)

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

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