bkdm
bkdm

Reputation: 328

How to sort/unique output using jq

I have json like below:

% cat example.json
{
    "values" : [
        {
            "title": "B",
            "url": "https://B"
        },
        {
            "title": "A",
            "url": "https://A"
        }
    ]
}

I want to sort the values based on title. i.e. expected output

{
  "title": "A",
  "url": "https://A"
}
{
  "title": "B",
  "url": "https://B"
}

Tried the blow. Does not work:

% jq '.values[] | sort' example.json           
jq: error (at example.json:12): object ({"title":"B...) cannot be sorted, as it is not an array

% jq '.values[] | sort_by(.title)' example.json
jq: error (at example.json:12): Cannot index string with string "title"

Upvotes: 3

Views: 3872

Answers (1)

peak
peak

Reputation: 116740

If you want to preserve the overall structure, you would use the jq filter:

.values |= sort_by(.title)

If you want to extract .values and sort the array, leave out the "=":

.values | sort_by(.title)

To produce the output as shown in the Q:

.values | sort_by(.title)[]

Uniqueness

There are several ways in which "uniqueness" can be defined, and also several ways in which uniqueness can be achieved.

One option would simply be to use unique_by instead of sort_by; another (with different semantics) would be to use (sort_by(.title)|unique) instead of sort_by(.title).

Upvotes: 6

Related Questions