Слияние и сортировка JSON с использованием JQ - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть файл, содержащий следующую структуру и неизвестное количество результатов:

{
"results": [
      [
         {
            "field": "AccountID",
            "value": "5177497"
         },
         {
            "field": "Requests",
            "value": "50900"
         }
      ],
      [
         {
            "field": "AccountID",
            "value": "pro"
         },
         {
            "field": "Requests",
            "value": "251"
         }
      ]
   ],
   "statistics": {
      "Matched": 51498,
      "Scanned": 8673577,
      "ScannedByte": 2.72400814E10
   },
   "status": "HOLD"
}
{
"results": [
      [
         {
            "field": "AccountID",
            "value": "5577497"
         },
         {
            "field": "Requests",
            "value": "51900"
         }
      ],
   "statistics": {
      "Matched": 51498,
      "Scanned": 8673577,
      "ScannedByte": 2.72400814E10
   },
   "status": "HOLD"
}

Существует несколько таких результатов, которые индексируются как массив с папкой результатов. Они не разделяются запятой.

Я пытаюсь просто напечатать "AccountID", отсортированный по "Запросы" в ZSH, используя jq. Я попытался сгладить их и использовать:

jq -r '.results [] [0] | .value' имя файла

jq -r '.results [] [1] | .value 'filename

Чтобы получить идентификатор учетной записи и запросы отдельно и сортировать их. Я не думаю, что bash имеет словарь, который можно использовать. Проблема заключается в файле, так как поле и значение не являются парой ключ-значение, но являются обеими парами. Поэтому извлечение их с использованием двух вышеупомянутых строк в отдельные массивы и сортировка по второму массиву кажется слишком длинным. Мне было интересно, если есть способ объединить обе операции. Другой способ - объединить все в строку и отсортировать в порядке возрастания. Python, вероятно, будет лучшим решением, но код должен быть zsh или bash.

Решения, которые используют sed, jq или любые другие ZSH поддерживаемые компиляторы, приветствуются. Если есть способ создать словарь в bash, пожалуйста, дайте мне знать.

Требуемым выходным требованием является только идентификатор учетной записи против номера запроса.

5577497 has 51900 requests
5177497 has 50900 requests
pro has 251 requests

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020
jq -S '.results[] | map( { (.field) : .value} ) | add' query-results-aggregate \
  | jq -s -c 'group_by(.number_of_requests) | .[]'

Это делает трюк. Спасибо пику за руководство.

0 голосов
/ 14 апреля 2020

Если вы не против изучения небольшого jq, то, вероятно, лучше написать небольшую jq-программу, которая будет делать то, что вы хотите.

Чтобы начать, рассмотрите следующую jq-программу, которая предполагает ваш ввод представляет собой поток действительных JSON объектов с ключом «результатов», аналогичным вашему образцу:

[inputs | .results[] | map( { (.field) : .value} ) | add]

После внесения незначительных изменений в ваш ввод, чтобы он состоял из действительных JSON объектов, вызов jq с опцией -n создает массив объектов AccountID / Requests:

[
  {
    "AccountID": "5177497",
    "Requests": "50900"
  },
  {
    "AccountID": "pro",
    "Requests": "251"
  },
  {
    "AccountID": "5577497",
    "Requests": "51900"
  }
]

Теперь вы можете (например) использовать jq's group_by для группировки этих объектов по AccountID и, таким образом, получить результат ты хочешь.

...