Предоставление очень большого аргумента команде jq для фильтрации по ключам - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь проанализировать очень большой файл, который состоит из JSON объектов, таких как:

{"id": "100000002", "title": "some_title",  "year": 1988}

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

Теперь я знаю, что могу сделать это:

jq '[ .[map(.id)|indices("1", "2")[]] ]' 0.txt > p0.json

, который дает желаемый результат, а именно заполняет p0. json только теми объектами, которые имеют " id "1 и" 2 ". Теперь возникает проблема: мой список идентификаторов тоже очень длинный (около 100 Кб). Итак, у меня есть программа Python, которая выводит соответствующие идентификаторы. Мое мышление состояло в том, чтобы сначала присвоить это переменной:

 REL_IDS=`echo python3 rel_ids.py`

А затем сделать:

jq --arg ids "$REL_IDS" '[ .[map(.id)|indices($ids)[]] ]' 0.txt > p0.json

Я пробовал оба с скобками [$ids] и без скобок, но нет пока удачи.

У меня такой вопрос, учитывая большое количество аргументов для фильтра, как бы я мог добавить их в свою команду jq?

Заранее большое спасибо!

1 Ответ

1 голос
/ 24 апреля 2020

Поскольку список идентификаторов длинный, хитрость в том, чтобы НЕ использовать --arg. Однако детали будут зависеть от деталей относительно «длинного списка идентификаторов».

В целом, вы бы хотели представить список идентификаторов jq в виде файла, чтобы вы могли использовать --rawfile или --slurpfile или что-то подобное.

Если по какой-то причине вы не хотите беспокоиться о реальном файле, то, если ваша оболочка это позволяет, вы можете использовать эти файловые опции с подстановкой процесса: <( ... )

Пример

Если предположить, что идентификаторы. json содержит перечисление идентификаторов в виде строк JSON:

"1"
"2"
"3"

, тогда можно написать:

< objects.json jq -c -n --slurpfile ids ids.json '
  inputs | . as $in | select( $ids | index($in.id))'

Обратите внимание на использование параметра командной строки -n.

...