фильтр json, когда он должен удовлетворять двум условиям. Один для ключа и один во вложенном массиве для выбранного элемента с помощью jq - PullRequest
0 голосов
/ 04 марта 2020

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

возвращает все идентификаторы, которые имеют элемент, который начинается с 4, но также имеют массив в нем есть либо значение

\ "v \", либо значение \ "9 \".

Вход json:

{
  "memo": {
    "notice": "delivered on 17"
  },
  "message": "{\"id\":\"1\",\"401\":[[\" 0\",[\"a\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "memo": {
    "notice": "delivered on 190"
  },
  "message": "{\"id\":\"2\",\"424\":[[\" 0\",[\"v\",\"UK\"],[\"9\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "memo": {
    "notice": "delivered on 734"
  },
  "message": "{\"id\":\"3\",\"432\":[[\" 0\",[\"a\",\"UK\"],[\"9\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"v\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "memo": {
    "notice": "delivered on 1092"
  },
  "message": "{\"id\":\"888\",\"532\":[[\" 0\",[\"v\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}

snippet that needs to be adjusted:
< input.json jq -r '.content
    | fromjson
    | select( any(keys_unsorted[]; test("^4")) )
    | .["id"]'

Требуемый выход :

2
3

jq версия: 1.6, уже безуспешно пытался использовать: 1. index 2. встроенный оператор IN

Нам нужны только значения 001 для каждого json объекта , который имеет элемент, начинающийся с 4, и этот элемент (скажем, 401) также имеет значение v, или 9 в своем вложенном массиве, или оба v и 9.

1 Ответ

1 голос
/ 04 марта 2020

Во-первых, соответствующий ключ - .message, а не .content.

Во-вторых, поскольку вы налагаете дополнительное условие, вы должны использовать только and.

Третий требования немного двусмысленны, но следующее приводит к ожидаемым результатам и является решением одной неоднозначности указанной проблемы:

.message
    | fromjson
    | select( any(keys_unsorted[]; test("^4")) 
              and (.[] | arrays | flatten | (index(["v"]) or index(["9"])) )  )
    | .["id"]

Как вы предполагаете, вы также можете использовать IN.

...