jq использует поток для разбора файла json> 20 Гб - PullRequest
1 голос
/ 03 марта 2020

У меня есть файл json, который составляет> 20 ГБ данных, как показано ниже:

{
  "_id": {
    "$serialnumber": "572"
  },
  "content": "{\"001\":\"77\",\"401\":[[\" 0\",[\"a\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "_id": {
    "$serialnumber": "573"
  },
  "content": "{\"001\":\"234\",\"424\":[[\" 0\",[\"a\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "_id": {
    "$serialnumber": "574"
  },
  "content": "{\"001\":\"549\",\"432\":[[\" 0\",[\"a\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "_id": {
    "$serialnumber": "575"
  },
  "content": "{\"001\":\"888\",\"532\":[[\" 0\",[\"a\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}

Мне нужен способ с потоком JQ (я установил версию 1.6), чтобы получить все значения 001, что иметь в содержимом элемент 4 .. (400, или 401, или 402, или 403, ...)

, например, приведенное выше вернет:

77
234
549

и не 888, который не содержит 4 .. элемента.

001 77 has the \"401\" element
001 234 has the \"424\" element
001 549 has the \"432\" element

ниже, пожалуйста, найдите одну из моих попыток решить эту проблему:

jq -cn --stream 'fromstream(1|truncate_stream(inputs | select(.[0][] == "_id") | del(.[0][0]))) | select(.content == "400")'

1 Ответ

0 голосов
/ 03 марта 2020

Поскольку ваш ввод уже является потоком, нет необходимости использовать опцию --stream. Следующее дает желаемый результат:

< input.json jq -r '.content
| fromjson
| select( any(keys_unsorted[]; test("^4")) )
| .["001"]'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...