Объедините JSON Поле и добавьте значения, используя jq - PullRequest
0 голосов
/ 20 апреля 2020

Я должен собрать несколько JSON результатов с сайта. Поскольку у сайта есть предел параллелизма запросов и время ожидания запросов, временные рамки для запросов должны быть разделены. Таким образом, у меня осталось JSON следующим образом:

{
      "results": [
          [
              {
                  "field": "AccountId",
                  "value": "11352"
              },
              {
                  "field": "number_of_requests",
                  "value": "241398"
              }
          ],
          [
              {
                  "field": "AccountId",
                  "value": "74923"
              },
              {
                  "field": "number_of_requests",
                  "value": "238566"
              }
          ]
          ],
"statistics": {
          "recordsMatched": 502870.0,
          "recordsScanned": 165908292.0,
          "bytesScanned": 744173091162.0
      },
      "status": "Complete"
}
{
      "results": [
          [
              {
                  "field": "AccountId",
                  "value": "11352"
              },
              {
                  "field": "number_of_requests",
                  "value": "185096"
              }
           ]
          ],
"statistics": {
          "recordsMatched": 502870.0,
          "recordsScanned": 165908292.0,
          "bytesScanned": 744173091162.0
      },
      "status": "Complete"
  }

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

Желаемый вывод:

AccountID : Number of Requests
11352 : 426494
74923 : 238566

Текущий вывод:

AccountID : Number of Requests
11352 : 241398
11352 : 185096
74923 : 238566

Запущенный в данный момент jq-запрос принимает имя файла в качестве ResultDir:

list=$(jq -S '.results[] | map( { (.field) : .value} ) | add ' $ResultsDir | 
  jq -s -c 'sort_by(.number_of_requests|tonumber) | reverse[] ' |
  jq -r '"\(.AccountId) : \(.number_of_requests)"')

Как сделать Я объединяю результаты тех же учетных записей, прежде чем распечатать? Результаты также должны быть в порядке убывания количества запросов.

1 Ответ

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

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

Если предположить, что вход является действительным потоком JSON объектов вдоль линий, показанных в Q, следующее производит желаемый вывод:

jq -nr '
  [inputs | .results[] | map( { (.field) : .value} ) | add] 
  | group_by(.AccountId)
  | map([.[0].AccountId, (map(.number_of_requests|tonumber) | add)])
  | sort_by(.[1]) | reverse
  | .[]
  | join(" : ")
' 
...