比较两个JSON文件:Shell脚本

12

我想比较两个看起来像下面这样的JSON文件:

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

另一个文件的格式类似,但两个文件之间存在一些差异,因为一个JSON文件由3336行组成,而另一个由3724行组成。我想编写一个Shell脚本,逐行比较这两个文件,并在发现差异时输出差异出现的行号。

3个回答

27

要比较json文件,您应该将它们转换为具有相同键顺序的格式。非常好用的工具是jq(https://stedolan.github.io/jq/),您可以使用以下命令:

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

然后,您可以使用您最喜欢的文本文件比较工具。我喜欢 kdiff3 的 GUI 或者纯命令行环境下的 diff ,例如:

diff fileA_fmt.json fileB_fmt.json

2
确实是非常好的工具。只需在 MacOS 上执行 brew install jq 即可安装它。 - phadjido
1
需要注意的一点是,输出必须使用不同的文件。我试图覆盖相同的文件,结果导致留下了一个空文件。 - Qwertie

16

只需使用 diff 命令,例如:

diff --unified file1.json file2.json

是的,我已经尝试过了,但我不太确定标题的含义,比如 @@ -1,2841 +1,2721 @@。 - gkumar7
如果您不使用“统一”标志,那么您将看到类似于“9c9”的内容。它表示第9行已更改。 - Sergii Dymchenko
你能解释一下统一标记的符号吗?它基本上是指需要更改1到2841行吗?同样,第二个JSON文件中的1到2721行也需要更改吗? - gkumar7

7

跟进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)

1
太好了!还可以避免创建(和清理)临时文件的需要。 - FruitBreak

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