Ответ 1
Вы можете обернуть результаты select
в массиве:
jq '[.[]|select(.a=="x")][0]' your.json
Выход:
{
"a": "x",
"b": false
}
Я могу получить 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
Вы можете обернуть результаты select
в массиве:
jq '[.[]|select(.a=="x")][0]' your.json
Выход:
{
"a": "x",
"b": false
}
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
}
использовать 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]
возьмите первый элемент