简单的命令行JSON工具相当于Zeppelin笔记本的nbstripout

时间:2016-12-19 19:14:30

标签: json bash jq apache-zeppelin

一些背景

如果预计输出变化很大,则版本化笔记本可能会变得非常低效。我用Jupyter笔记本使用nbstripout解决了这个问题,但到目前为止,我找不到Zeppelin笔记本的替代品。

由于nbstripout使用nbformat来解析ipynb个文件,因此支持Zeppelin并不是一个简单的补丁。另一方面,目标并不复杂:只需清空所有"msg": "..."

目标

给定一个JSON文件,清空所有'paragraphs.result.msg'个字段。

示例(架构):

{"paragraps": [{"result": {"msg": "Very long output..."}}]}

3 个答案:

答案 0 :(得分:2)

在下面的(1)和(2)中,我假设传入的JSON看起来像这样:

{
  "paragraphs": [
    {
      "result": {
        "msg": "msg1"
      }
    },
    {
      "result": {
        "msg": "msg2"
      }
    }
  ]
}

1。将.result.msg值设置为“”

.paragraphs[].result.msg = ""

2。要完全删除.result.msg字段:

del(.paragraphs[].result.msg)

3。要删除所有对象中的“msg”字段,无论它们出现在何处:

walk(if type == "object" then del(.msg) else . end)

(如果你的jq没有walk,google:jq faq walk)

4。要删除.paragraphs数组中.result对象中出现的“msg”字段:

 walk(if type == "object" and (.paragraphs|type) == "array"
      then del(.paragraphs[].result?.msg?) else . end)

答案 1 :(得分:1)

JQ可以这样做:

jq .paragraphs[].result.msg file

http://stedolan.github.io/jq

答案 2 :(得分:0)

Git过滤器

最好的解决方案(感谢@ steven-penny)就是运行:

git config filter.znbstripout.clean "jq '.paragraphs[].result.msg = \"\"'"

将设置一个名为znbstripout的过滤器,用于调用jq工具。然后,在您的.gitattributes文件中,您可以放置​​:

*.json filter=znbstripout

Python脚本(可与Git Hooks一起使用)

以下内容可用作git hook:

#!/usr/bin/env python3

from glob import glob
import json

files = glob('**/note.json', recursive=True)
for file in files:
    with open(file, 'r') as fp:
        nb = json.load(fp)
    for p in nb['paragraphs']:
        if 'result' in p:
            p['result']['msg'] = ""
    with open(file, 'w') as fp:
        json.dump(nb, fp, sort_keys=True, indent=2)