Первый матч из потока JSON с использованием JQ - PullRequest
2 голосов
/ 04 июня 2019

почему first(select(.updated_at=="2019-06-03T16:36:53.194Z")) возвращает более 1 результата, когда ввод

{"_id":"a","updated_at":"2019-06-03T16:36:53.194Z"}
{"_id":"b","updated_at":"2019-06-03T19:27:15.192Z"}
{"_id":"c","updated_at":"2019-06-03T20:02:11.538Z"}
{"_id":"d","updated_at":"2019-06-03T21:12:05.764Z"}
{"_id":"e","updated_at":"2019-06-04T07:55:04.251Z"}
{"_id":"f","updated_at":"2019-06-03T22:21:37.276Z"}
{"_id":"g","updated_at":"2019-06-03T20:57:42.296Z"}
{"_id":"h","updated_at":"2019-06-03T18:56:07.687Z"}
{"_id":"i","updated_at":"2019-06-04T09:28:08.276Z"}
{"_id":"j","updated_at":"2019-06-04T08:54:05.048Z"}
{"_id":"k","updated_at":"2019-06-03T16:36:53.194Z"}
{"_id":"l","updated_at":"2019-06-03T16:36:53.194Z"}

https://jqplay.org/s/2sm1pKQ2fS

Я также пытался использовать nth, но, похоже, он также не работает ожидаемым образом:

https://jqplay.org/s/DeSANQZtj7

1 Ответ

2 голосов
/ 04 июня 2019

Потому что входные данные first - это поток объектов, и поэтому он запускается один раз для каждого. Чтобы запустить его один раз для всего потока, укажите флаг -n/--null-input в командной строке и получите доступ к входам, используя ключевое слово inputs. Таким образом, first будет иметь значение null, а его аргумент будет потоком объектов select ed из inputs, поэтому он сможет выдавать только первый.

$ jq -n 'first(inputs|select(.updated_at=="2019-06-03T16:36:53.194Z"))' file
{
  "_id": "a",
  "updated_at": "2019-06-03T16:36:53.194Z"
}
...