Jq найти максимальное значение в кавычках

Вот мой файл JSON test.json:

[
  {
    "name": "nodejs",
    "version": "0.1.21",
    "apiVersion": "v1"
  },
  {
    "name": "nodejs",
    "version": "0.1.20",
    "apiVersion": "v1"
  },
  {
    "name": "nodejs",
    "version": "0.1.11",
    "apiVersion": "v1"
  },
  {
    "name": "nodejs",
    "version": "0.1.9",
    "apiVersion": "v1"
  },
  {
    "name": "nodejs",
    "version": "0.1.8",
    "apiVersion": "v1"
  }
]

Когда я использую max_by, jq возвращает 0.1.9 вместо 0.1.21, вероятно, из-за значения в кавычках:

cat test.json | jq 'max_by(.version)'
{
  "name": "nodejs",
  "version": "0.1.9",
  "apiVersion": "v1"
}

Как я могу получить элемент с версией = 0.1.21?

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
4
0
2 121
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Сравнение Семантическая версия изначально не поддерживается в jq. Вам нужно поиграть с полями, разделенными на .

jq 'sort_by(.version | split(".") | map(tonumber))[-1]'

split(".") берет строку из .version и создает массив полей, то есть 0.1.21 становится массивом [ "0", "1", "21"], а map(tonumber) берет входной массив и преобразует элементы строки в массив цифр.

Функция sort_by() выполняет индексное сравнение для каждого из элементов в массиве, сгенерированном на последнем шаге, и сортирует в порядке возрастания с объектом, содержащим версию 0.1.21 последним. Обозначение [-1] состоит в том, чтобы получить последний объект из этого отсортированного массива.

хороший однострочный ответ. Я тестировал с другими значениями, такими как 0.2.1 или 11.7, и это работает во всех случаях. Спасибо

Nicolas Pepinster 17.07.2019 10:32

Можно было бы просто использовать max_by.

peak 17.07.2019 11:23

Вот адаптация более общего ответа с использованием jq в Как отсортировать результаты поиска пакетов Artifactory по номеру версии с помощью JFrog CLI?

def parse:
 [splits("[-.]")]
 | map(tonumber? // .) ;

max_by(.version|parse)

Как менее надежный однострочный:

max_by(.version | [splits("[.]")] | map(tonumber))

это также полезно для сортировки адресов ipv4. я застрял, пытаясь отсортировать адрес ipv6, нет «tobase16»

Greg 18.07.2019 18:38

@Greg - см. rosettacode.org/wiki/Non-decimal_radices/Convert#jq

peak 18.07.2019 18:49

Приятно! Благодарю. Кстати, чтобы заставить эту однострочную работу работать, мне пришлось добавить: max_by(.version|[splits("[.]")] | map(tonumber))

Greg 18.07.2019 21:01

@грег: исправлено. Спасибо.

peak 18.07.2019 23:08

Другие вопросы по теме