2016-10-07 4 views
0

С помощью JQ я хотел бы, чтобы выбрать все адреса узлов, которые имеют по крайней мере один необходимого = True в их списке атрибутов. Список результатов должен иметь уникальные элементы.JQ выберите атрибут, если любой элемент массива удовлетворяет условие

Вот мой Json:

{ 
"nodes": [ 
    { 
     "address":"127.0.0.1", 
     "attributes": [ 
      { 
       "id":"abc", 
       "required":true 
      }, 
      { 
       "id":"def", 
       "required":true 
      }, 
      { 
       "id":"ghi", 
       "required":false 
      } 
     ] 
    }, 
    { 
     "address":"127.0.0.2", 
     "attributes": [ 
      { 
       "id":"abc", 
       "required":false 
      }, 
      { 
       "id":"def", 
       "required":false 
      } 
     ] 
    } 
] 
} 

я впервые попробовал с:

jq '.nodes[] | select(.attributes[].required == true) | .address' 

Это дает:

"127.0.0.1" 
"127.0.0.1" 

Так он получает адрес для каждого требуется = истина которое он находит в разделе атрибутов. Как сделать список результатов уникальным? В jq есть также уникальное ключевое слово, но я не мог понять, как это может мне помочь.

ответ

0

Использование unique безопасно, но для этого требуется сортировка, которая может не понадобиться. Например, в вашем конкретном случае повторение является артефактом запроса jq. Вместо этого используйте вместо него (или также) any, так как он более точно фиксирует намерение («по крайней мере один»), а также имеет «короткозамкнутую» семантику (т. Е. Прекращает поиск после того, как условие истинно):

$ jq '.nodes[] 
| select(any(.attributes[]; .required == true)) 
| .address' input.json 

Выход:

"127.0.0.1" 

Вы всегда можете добавить unique при необходимости.

Смежные вопросы