Первое вхождение элемента в словарь json с jq - PullRequest
1 голос
/ 24 апреля 2020

У меня есть следующее json:

$ echo '{ "format_id": "250" }{ "format_id": "18" }{ "format_id": "140" }{ "format_id": "18" }{ "format_id": "244" }' | jq .
{
  "format_id": "250"
}
{
  "format_id": "18"
}
{
  "format_id": "140"
}
{
  "format_id": "18"
}
{
  "format_id": "244"
}

Мне удалось извлечь format_id s, для которых он равен "18":

$ echo '{ "format_id": "250" }{ "format_id": "18" }{ "format_id": "140" }{ "format_id": "18" }{ "format_id": "244" }' | jq -r 'select(.format_id=="18")'
{
  "format_id": "18"
}
{
  "format_id": "18"
}

Я хочу извлечь из-за этого 1-е вхождение format_id.

Итак, я попробовал решения, приведенные здесь , но ни одно из них не сработало, потому что я думаю, что их нужно как-то адаптировать к моим входным данным:

$ echo '{ "format_id": "18" }{ "format_id": "18" }' | jq '[.[]|select(.format_id)][0]'
jq: error (at <stdin>:1): Cannot index string with string "format_id"
jq: error (at <stdin>:1): Cannot index string with string "format_id"
$ echo '{ "format_id": "18" }{ "format_id": "18" }' | jq '( map(select(.format_id)) | first  )'
jq: error (at <stdin>:1): Cannot index string with string "format_id"
jq: error (at <stdin>:1): Cannot index string with string "format_id"
$ echo '{ "format_id": "18" }{ "format_id": "18" }' | jq '( first(.[]  | select(.format_id)) )'
jq: error (at <stdin>:1): Cannot index string with string "format_id"
jq: error (at <stdin>:1): Cannot index string with string "format_id"
$ echo '{ "format_id": "18" }{ "format_id": "18" }' | jq 'map(select(.format_id))|.[0]'        
jq: error (at <stdin>:1): Cannot index string with string "format_id"
jq: error (at <stdin>:1): Cannot index string with string "format_id"

Не могли бы вы мне помочь?

1 Ответ

2 голосов
/ 24 апреля 2020

Если ваш jq имеет inputs, то лучше использовать его вместе с параметром командной строки -n и следующим фильтром jq:

first(inputs | select(.format_id =="18"))

Если ваш jq не имеет inputs

... тогда вам придется использовать параметр командной строки -s, например, со следующим фильтром:

first(.[] | select(.format_id =="18"))

Здесь использование inputs предпочтительно в качестве требуется меньше оперативной памяти.

...