mikefarah / yq

yq is a portable command-line YAML, JSON, XML, CSV, TOML and properties processor
https://mikefarah.gitbook.io/yq/
MIT License
12.36k stars 602 forks source link

Unique does not work on arrays with objects #2068

Closed reuzel closed 5 months ago

reuzel commented 5 months ago

Describe the bug When provided with an array of objects, unique does not perform a 'deep' comparison to determine equality (like jq does).

Version of yq: 4.44.1 Operating system: linux Installed via: binary release

Input Yaml Concise yaml document(s) (as simple as possible to show the bug, please keep it to 10 lines or less) data1.yml:

- a: 1
  b: 2
- a: 2
  b: 2
- a: 1
  b: 2
- a: 1
  b: 1

Command The command you ran:

yq e 'unique' data1.yml

Actual behavior

- a: 1
  b: 2

Expected behavior

- a: 1
  b: 2
- a: 2
  b: 2
- a: 1
  b: 1

Additional comment Using a roundtrip via jq provides the right output (though the order in the output was sorted):

cat data1.yml | yq -j - | jq 'unique' - | yq -P -

result:

- a: 1
  b: 1
- a: 1
  b: 2
- a: 2
  b: 2
mikefarah commented 5 months ago

Unique really only operates on scalars (strings/numbers/..) but what you can do, is unique_by(exp); and give it an expression that gives a scalar that it knows how to compare:

yq 'unique_by(to_yaml)' data1.yaml
- a: 1
  b: 2
- a: 2
  b: 2
- a: 1
  b: 1
mikefarah commented 5 months ago

Guess I can use this same trick in the unique function under the hood to handle objects 🤔

mikefarah commented 5 months ago

Fixed in v4.44.2