【问题标题】:Comparing two json files : shell scripting比较两个 json 文件:shell 脚本
【发布时间】:2013-12-31 01:22:30
【问题描述】:

我想比较两个如下所示的 json 文件:

[
   {
      "type" : 1,
      "children" : {
         "nsubj" : {
            "role" : "topic",
            "POS" : [
               "noun"
            ]
         }
      },
      "role" : "vehicle",
      "POS" : [
         "noun"
      ]
   },

另一个是类似的格式,但是两者之间存在一些差异,因为一个json文件由3336行组成,而另一个由3724行组成。我想编写一个shell脚本,它会逐行比较两者,每当发现差异时,输出发生差异的行号。

【问题讨论】:

    标签: json shell diff jq


    【解决方案1】:

    要比较 json 文件,您应该转换它们,使它们具有相同的键顺序。非常适合这项工作的工具是 jq (https://stedolan.github.io/jq/),您可以在其中做:

    jq -S . fileA.json > fileA_fmt.json
    jq -S . fileB.json > fileB_fmt.json
    

    然后,您可以使用自己喜欢的工具进行文本文件比较。我喜欢 GUI 的 kdiff3 或纯命令行中的普通 diff 例如:

    diff fileA_fmt.json fileB_fmt.json
    

    【讨论】:

    • 确实是非常好的工具。只需brew install jq 即可在 MacOS 上安装它
    • 需要注意的是,您必须为输出使用不同的文件。我试图覆盖同一个文件,结果却给你留下了一个空文件。
    【解决方案2】:

    只需使用差异。喜欢在

    diff --unified file1.json file2.json
    

    【讨论】:

    • 是的,我已经尝试过了,但我不太清楚标题的含义是什么,例如@@ -1,2841 +1,2721 @@
    • 如果你不使用'unified'标志,那么你会看到类似“9c9”的东西。这意味着第 9 行已更改。
    • 你能解释一下统一标志的符号吗,基本上是说第1到2841行需要改变吗?同样需要在第二个 json 文件中更改第 1 到 2721 行?
    【解决方案3】:

    只是为了更新 bartolomeon_n 的答案,您实际上可以在一行中完成所有这些操作。

    diff <(jq -S . fileA.json) <(jq -S . fileB.json)
    # or, with nice columns and colours:
    diff -y --left-column --color <(jq -S . fileA.json) <(jq -S . fileB.json)
    

    【讨论】:

    • 太棒了!也无需创建(和清理)临时文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2010-12-10
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多