Прекращение обработки jq при выполнении условия

Я использую jq для поиска конкретных результатов в большом файле. Меня не интересуют повторяющиеся записи, соответствующие этому конкретному условию, и обработка всего файла занимает некоторое время. Что я хотел бы сделать, так это распечатать некоторые подробности о первом совпадении, а затем завершить команду jq в файле, чтобы сэкономить время.

I.e.

jq '. | if ... then "print something; exit jq" else ... end'

Я просмотрел http://stedolan.github.io/jq/manual/?#Breakingoutofcontrolstructures но это не совсем применимо

РЕДАКТИРОВАТЬ: файл, который я анализирую, содержит несколько объектов json, один за другим. Они не в массиве.


jq
person curious-me    schedule 27.07.2015    source источник
comment
Является ли ваш большой файл одним значением json (например, массивом) или несколькими значениями (объекты один за другим)?   -  person Jeff Mercado    schedule 28.07.2015
comment
Не могли бы вы привести более конкретный пример имеющихся у вас данных и того, как вы собираетесь их обрабатывать?   -  person Jeff Mercado    schedule 28.07.2015
comment
Как сказал Джефф, было бы здорово, если бы вы предоставили образец данных. Это особенно важно, учитывая, что ваш вариант использования, вероятно, требует использования флага --stream, который существенно меняет правила и делает базовые операции jq невероятно сложными.   -  person    schedule 28.07.2015


Ответы (2)


Вот подход, который использует последнюю версию first/1 (в настоящее время в мастере)

def first(g): label $out | g | ., break $out; 

first(inputs | if .=="100" then . else empty end)

Пример:

$ seq 1000000000 | jq -M -Rn -f filter.jq

Вывод (с последующим немедленным прекращением)

"100"

Здесь я использую seq вместо большого набора данных JSON.

person jq170727    schedule 07.09.2017

Сделать то, что требуется, можно с помощью функций, которые были добавлены после выпуска jq 1.4. В следующем примере используются foreach и inputs:

label $top
| foreach inputs as $line
   # state: true means found; false means not yet found
   (false;
    if . then break $top
    else if $line | tostring | test("goodbye") then true else false end
    end;
    if . then $line else empty end
   )

Пример:

$ cat << EOF | jq -n -f exit.jq
1
"goodbye"
3
4
EOF

Результат: "до свидания"

person peak    schedule 05.08.2015