使用 jq 比较两个 JSON 文件,并将第一个文件中的键值对保留在匹配键上

Comparing two JSON files using jq and keeping the key-value pair from the first file on matching key

我有这两个 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",
}

任何 help/suggestions 将不胜感激。

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

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

Online demo

这只是@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