Получить первый (или n'th) элемент в jq json parsing

Я могу получить 1-й элемент в json внутри []

$ echo '[{"a":"x", "b":true}, {"a":"XML", "b":false}]' | jq '.[1]'
{
  "a": "XML",
  "b": false
}

Но если json уже разобран (например, после фильтрации записей с использованием "select" ), как я могу выбрать одну запись и избежать ошибки, видимой здесь?

$ echo '[{"a":"x", "b":true}, {"a":"x", "b":false},{"a":"XML", "b":false}]' | jq '.[] | select( .a == "x")'
{
  "a": "x",
  "b": true
}
{
  "a": "x",
  "b": false
}
$ echo '[{"a":"x", "b":true}, {"a":"x", "b":false},{"a":"XML", "b":false}]' | jq '.[] | select( .a == "x") | .[1]'
jq: error (at <stdin>:1): Cannot index object with number

Ответ 1

Вы можете обернуть результаты select в массиве:

jq '[.[]|select(.a=="x")][0]' your.json

Выход:

{
  "a": "x",
  "b": false
}

Ответ 2

JQ также обеспечивает first/0, last/0, nth/1 так что в этом случае фильтр

  ( map(select(.a == "x")) | first  )
, ( map(select(.a == "x")) | last   ) 
, ( map(select(.a == "x")) | nth(1) )

производит

{
  "a": "x",
  "b": true
}
{
  "a": "x",
  "b": false
}
{
  "a": "x",
  "b": false
}

Дополнительные потоковые формы 'first/1', 'last/1' и 'nth/2' также доступны с этими данными

  ( first(.[]  | select(.a == "x")) )   
, ( last(.[]   | select(.a == "x")) )
, ( nth(1; .[] | select(.a == "x")) )

производит

{
  "a": "x",
  "b": true
}
{
  "a": "x",
  "b": false
}
{
  "a": "x",
  "b": false
}

Ответ 3

использовать map

cat raw.json|jq -r -c 'map(select(.a=="x"))|.[1]'

map получить фильтр для фильтрации массива.

эта команда

cat raw.json|jq -r -c 'map(select(.a=="x"))'

дают средний результат

[{"a":"x","b":true},{"a":"x","b":false}]

.[1] возьмите первый элемент