Нахождение наибольшего значения в определенном поле JSON в Bash - PullRequest
0 голосов
/ 21 мая 2019

Я пишу bash-скрипт, который скручивает POST API. Ответ от поста имеет значения, возвращаемые в следующем формате:

{
  "other": "irrelevant-fields",
  "results": [
    {
      "datapoints": [
        {"timestamp": 1555977600, "value": 0},
        {"timestamp": 1555984800, "value": 15},
        {"timestamp": 1555992000, "value": 5}
      ]
    }
  ]
}

Я хочу извлечь наибольшее значение из столбцов «value», но у меня возникают проблемы при написании этого кода на bash. Я новичок в JSON, и нет никаких реальных ссылок, которые я могу использовать, чтобы отфильтровать строки и значения, которые мне не нужны, так как каждый массив одинаков за исключением метки времени, но мне не важна метка времени, только возвращено самое высокое значение

Мой текущий код - это просто общий способ извлечь наибольшее число из файла в bash:

grep -Eo '[[:digit:]]+' | sort -n | tail -n 1

... но вместо 15 возвращается 1555992000.

Ответы [ 3 ]

3 голосов
/ 21 мая 2019
echo '
{
  "other": "irrelevant-fields",
  "results": [
    {
      "datapoints": [
        {"timestamp": 1555977600, "value": 0},
        {"timestamp": 1555984800, "value": 15},
        {"timestamp": 1555992000, "value": 5}
      ]
    }
  ]
}
' | jq '.results[].datapoints | max_by(.value)'

Вывод будет таким:

{
  "timestamp": 1555984800,
  "value": 15
}

Для получения дополнительной информации см. Этот пост Medium по jq или домашнюю страницу программы по адресу https://stedolan.github.io/jq/

0 голосов
/ 22 мая 2019

Пожалуйста, обработайте JSON с соответствующим интерпретатором / синтаксическим анализатором JSON, например Xidel .

$ cat <<EOF | xidel -s - -e '$json/max((.//datapoints)()/value)'
{
  "other": "irrelevant-fields",
  "results": [
    {
      "datapoints": [
        {"timestamp": 1555977600, "value": 0},
        {"timestamp": 1555984800, "value": 15},
        {"timestamp": 1555992000, "value": 5}
      ]
    }
  ]
}
EOF

Возвращает 15.

(или полностью: -e '$json/max((results)()/(datapoints)()/value)')

0 голосов
/ 21 мая 2019

позвольте мне предложить вам решение, основанное на инструменте Unix с обходом пути для JSON: jtc:

1. если вам нужно знать только самое высокое значение в datapoints, то вы можете сбросить все записи, отсортировать их все и отобразить последнюю:

bash $ <file.json jtc -w'<datapoints>l[:][value]' -r | sort -n | tail -1
46.0
bash $ 

2. если вы хотите просмотреть запись (с отметкой времени), это будет выглядеть так:

bash $ <file.json jtc -w'<datapoints>l[:]' -r | sort -n -k5 | tail -1
{ "timestamp": 1556611200, "value": 46.0 }
bash $

PS> Раскрытие информации: я создатель инструмента jtc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...