yq/operators/sort.md
2023-02-20 16:08:51 +11:00

2.5 KiB

Sort

Sorts an array. Use sort to sort an array as is, or sort_by(exp) to sort by a particular expression (e.g. subfield).

To sort by descending order, pipe the results through the reverse operator after sorting.

Note that at this stage, yq only sorts scalar fields.

Sort by string field

Given a sample.yml file of:

- a: banana
- a: cat
- a: apple

then

yq 'sort_by(.a)' sample.yml

will output

- a: apple
- a: banana
- a: cat

Sort by multiple fields

Given a sample.yml file of:

- a: dog
- a: cat
  b: banana
- a: cat
  b: apple

then

yq 'sort_by(.a, .b)' sample.yml

will output

- a: cat
  b: apple
- a: cat
  b: banana
- a: dog

Sort descending by string field

Use sort with reverse to sort in descending order.

Given a sample.yml file of:

- a: banana
- a: cat
- a: apple

then

yq 'sort_by(.a) | reverse' sample.yml

will output

- a: cat
- a: banana
- a: apple

Sort array in place

Given a sample.yml file of:

cool:
  - a: banana
  - a: cat
  - a: apple

then

yq '.cool |= sort_by(.a)' sample.yml

will output

cool:
  - a: apple
  - a: banana
  - a: cat

Sort array of objects by key

Note that you can give sort_by complex expressions, not just paths

Given a sample.yml file of:

cool:
  - b: banana
  - a: banana
  - c: banana

then

yq '.cool |= sort_by(keys | .[0])' sample.yml

will output

cool:
  - a: banana
  - b: banana
  - c: banana

Sort is stable

Note the order of the elements in unchanged when equal in sorting.

Given a sample.yml file of:

- a: banana
  b: 1
- a: banana
  b: 2
- a: banana
  b: 3
- a: banana
  b: 4

then

yq 'sort_by(.a)' sample.yml

will output

- a: banana
  b: 1
- a: banana
  b: 2
- a: banana
  b: 3
- a: banana
  b: 4

Sort by numeric field

Given a sample.yml file of:

- a: 10
- a: 100
- a: 1

then

yq 'sort_by(.a)' sample.yml

will output

- a: 1
- a: 10
- a: 100

Sort by custom date field

Given a sample.yml file of:

- a: 12-Jun-2011
- a: 23-Dec-2010
- a: 10-Aug-2011

then

yq 'with_dtf("02-Jan-2006"; sort_by(.a))' sample.yml

will output

- a: 23-Dec-2010
- a: 12-Jun-2011
- a: 10-Aug-2011

Sort, nulls come first

Given a sample.yml file of:

- 8
- 3
- null
- 6
- true
- false
- cat

then

yq 'sort' sample.yml

will output

- null
- false
- true
- 3
- 6
- 8
- cat