Файл вложенной фильтрации json с оператором jq - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть json файл со следующей структурой каждого объекта внутри

{
  "id": 2400321267,
  "data": {
    "q": "quinoa black bean and shrimp r",
    "r": "quinoa black bean and shrimps r",
    "s": "3"
  },
  "job_id": 1413792,
  "results": {
    "judgments": [
      {
        "id": 5022700047,
        "unit_state": "good",
        "data": {
          "rewrite_quality": "1"
        },

      }
    ],

  }
},

{
  "id": 2400321267,
  "data": {
    "q": "quinoa black bean and shrimp r",
    "r": "quinoa black bean and shrimps r",
    "s": "3"
  },
  "job_id": 1413792,
  "results": {
    "judgments": [
      {
        "id": 5022700047,
        "unit_state": "good",
        "data": {
          "rewrite_quality": "2"
        },

      }
    ],

  }
}

, и я пытался использовать команду jq '.[] | select(any(.Tags[]; .rewrite_quality == "1"))' | less, чтобы попытаться проверить правильность вывода, но я не не вижу никакого выхода.

Я хочу, чтобы на выходе были только записи с rewrite_quality == '1', в данном случае только первая запись.

1 Ответ

1 голос
/ 27 февраля 2020

Читая между строк, может показаться, что следующий фильтр должен достичь заявленных целей:

.[]
| select( .results | any(.judgments[]; .data.rewrite_quality == "1"))

"Теги"

Если целью использования ".Tags" было указать, что не имеет значения, какой путь ведет к .rewrite_quality, тогда фильтр будет использоваться:

.[]
| select( any(.. | objects | .rewrite_quality == "1"))

Альтернатива использованию less

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

map(select(any(.. | objects | .rewrite_quality == "1"))) | length
...