Как отправить аргументы с помощью slurpfile и jq? - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь преобразовать этот запрос:

cat input_file.json | jq '.arrlstProperty[] | select(.code == "123" or .code=="345" or .code="678")' > output.json

В это:

cat input_file.json | jq '.arrlstProperty[] | select($codes[0])' --slurpfile codes args.json > sal.json

-- args.json: 
[".code==\"123\" or .code==\"234\""]

Но это не работает, фильтр выбора не применяется. Я знаю, потому что просто возвращает все элементы в массиве arrlstProperty.

Причина, по которой я так поступаю, заключается в том, что мне нужно отправить слишком много кодов (более 50 КБ) в select.

Это ошибка, если попытаться отправить более 2К кодов:

jq: error: function compiled to 77856 bytes which is too long

Упрощенная структура моего json файла:

{
  "user": {
    "id": 100,
    "action": "UPDATE",
    "years_experience": 0
  },
  "arrlstProperty": [
    {
      "id": 12345,
      "code": "EB-123",
      "galleries": [
        {
          "action": "UPDATE",
          "id": 90,
          "alt": "Foto de nave industrial en renta en  , antigua santa rosa, apodaca, nuevo león, 11448639 No. 01"
        },
        {
          "action": "UPDATE",
          "id": 91,
          "alt": "Foto de nave industrial en renta en  , antigua santa rosa, apodaca, nuevo león, 11448639 No. 02"
        }
      ]
    },
    {
      "id": 12346,
      "code": "EB-234",
      "galleries": [
        {
          "action": "UPDATE",
          "id": 92,
          "alt": "Foto de nave industrial en renta en  , antigua santa rosa, apodaca, nuevo león, 11448639 No. 01"
        },
        {
          "action": "UPDATE",
          "id": 93,
          "alt": "Foto de nave industrial en renta en  , antigua santa rosa, apodaca, nuevo león, 11448639 No. 02"
        }
      ]
    }
}

Ответы [ 2 ]

3 голосов
/ 11 апреля 2020

Slurping здесь не нужен.

Заполните args.json значениями code, которые будут выбраны, это будет выглядеть так:

"123"
"234"

Затем преобразуйте arrlstProperty в Выполните объект путем ввода каждого элемента со значением code, а затем индексируйте полученный объект ключами, хранящимися в args.json. Например:

jq '.arrlstProperty | INDEX(.code)[inputs]' input_file.json args.json

Онлайн-демонстрация

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

Вот скрипт для версии <1.6 </p>

jq '.arrlstProperty | map(.code as $x | select( any($codes[]; . == $x )))' --slurpfile codes args.json input_file.json
...