比较两个json文件:shell脚本

比较两个json文件:shell脚本,json,shell,diff,jq,Json,Shell,Diff,Jq,我想比较两个json文件,如下所示: [ { "type" : 1, "children" : { "nsubj" : { "role" : "topic", "POS" : [ "noun" ] } }, "role" : "vehicle", "POS" : [ "noun

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

[
   {
      "type" : 1,
      "children" : {
         "nsubj" : {
            "role" : "topic",
            "POS" : [
               "noun"
            ]
         }
      },
      "role" : "vehicle",
      "POS" : [
         "noun"
      ]
   },
另一个是类似的格式,但两者之间存在一些差异,因为一个json文件由3336行组成,而另一个由3724行组成。我想写一个shell脚本,逐行比较这两个脚本,每当它发现差异时,输出出现差异的行号

只需像中一样使用diff

diff --unified file1.json file2.json

要比较json文件,您应该转换它们,使它们具有相同的键顺序。这项工作的一个非常好的工具是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

只是为了更新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)

diff是的,我已经试过了,但我不太确定标题的含义是什么@@12841+12721@@例如,如果不使用“统一”标志,则会看到类似“9c9”的内容。这意味着第9行已经更改。您能解释一下统一标志的符号吗,基本上是说第1行到2841行需要更改吗?类似地,第二个json文件中的第1行到2721行也需要更改,这确实是一个非常好的工具。只需
brew install jq
就可以在macoso上安装它。需要注意的一点是,输出必须使用不同的文件。我试图在同一个文件上写,结果留下了一个空文件。太好了!还消除了创建(和清理)临时文件的需要。