【问题标题】:Comparing two JSON files using jq and keeping the key-value pair from the first file on matching key使用 jq 比较两个 JSON 文件并将第一个文件中的键值对保留在匹配键上
【发布时间】:2021-10-11 12:38:34
【问题描述】:

我有这两个json 文件,我正在尝试使用jq 查找具有相同keys 但不同values 的元素。请查看预期输出以获得更清晰的信息。

JSON 文件 1:

{
  "COMMON-VAR": "ABC",
  "LASTNAME": "D",
  "FIRSTNAME": "JOHN"
}

JSON 文件 2:

{
  "COMMON-VAR": "DEF",
  "LASTNAME": "S",
  "FIRSTNAME": "JOHN",
  "ADDRESS": "SanJose, CA",
  "ZIP": "09817"
}

预期输出:

{
  "COMMON-VAR": "ABC",
  "LASTNAME": "D",
}

任何帮助/建议将不胜感激。

【问题讨论】:

  • 为了将来参考,最好展示一些你所做的研究工作的证据,例如。以试图解决问题的形式。 (参见例如meta.stackoverflow.com/questions/261592/…
  • @peak 我已尝试通过转换为yaml 文件并使用joinyq 来实现这一点。我没有尝试避免混淆。 join <(sort file1.yaml) <(sort file2.yaml) | awk '$2!=$3{print $1,$3}' | yq e -I4

标签: json yaml jq


【解决方案1】:

遍历第一个对象的键并检查它们是否存在于第二个对象中并且在两个对象中具有相同的值。删除那些做的,其余的保持原样。

inputs as $a
| reduce keys_unsorted[] as $k (.;
  if ($k | in($a)) and (.[$k] == $a[$k]) then del(.[$k]) else . end
)

Online demo

【讨论】:

    【解决方案2】:

    这只是@oguzismail 完美答案的变体。除了建设性地使用reduce 而不是使用del,在我看来它至少更具可读性,例如关于两个文件各自的作用:

    jq -n '
      input as $f1 | input as $f2
      | reduce ($f1|keys_unsorted[]) as $k ({};
          if $f2 | has($k) and $f1[$k] != $f2[$k] then .[$k]=$f1[$k] else . end)
    ' file1.json file2.json
    

    【讨论】:

      猜你喜欢
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      相关资源
      最近更新 更多