jq比较两个文件并以文本格式输出差异

时间:2019-11-28 09:24:38

标签: shell jq

我有2个文件

file_one.json

{
    "releases": [
        {
            "name": "bpm",
            "version": "1.1.5"
        },
        {
            "name": "haproxy",
            "version": "9.8.0"
        },
        {
            "name": "test",
            "version": "10"
        }
    ]
}

和file_two.json

{
    "releases": [
        {
            "name": "bpm",
            "version": "1.1.6"
        },
        {
            "name": "haproxy",
            "version": "9.8.1"
        },
        {
            "name": "test",
            "version": "10"
        }
    ]
}

在文件2中,版本已更改,我需要回显新的更改。 我已使用以下命令查看更改:

diff -C 2  <(jq -S . file_one.json) <(jq -S . file_two.json)

但是比我需要将输出格式化为这样的东西。 我需要输出文本:

The new versions are:
bpm 1.1.6
haproxy 9.8.1

1 个答案:

答案 0 :(得分:3)

您也许可以使用以下myemail@gmail.com 命令:

jq

它首先合并两个releases数组,按名称对元素进行分组,然后统一结果数组的元素,使用单个元素(两个文件之间相同的版本)删除数组,然后将数组映射到它们最大的元素(按版本),最后格式化它们以供显示。

您可以try it here

一些特殊性可能会使此解决方案不适用于您:

  • 它不仅报告版本升级,而且还报告版本降级。但是,无论包含哪个文件,它总是返回最大版本。
  • 版本比较是按字母顺序进行的。您的示例可以,但是对于多位数的版本可能会失败(例如,由于jq --slurp -r 'map(.releases) | add | group_by(.name) | map(unique | select(length > 1) | max_by(.version)) | map("\(.name) : \(.version)") | join("\n")' file_one.json file_two.json > 1.1.51.1.20被认为大于5)。这可能是固定的,但可能不会出现问题,具体取决于您的版本控制方案。

根据注释中更新的请求进行编辑:以下2命令将输出在第一个文件和第二个文件之间更改的版本。它很好地处理了降级,并在某种程度上处理了第二个文件中已出现或消失的产品(尽管无论它是已出现还是已消失的产品始终将版本显示为jq)。

version --> null

您可以try it here