Первая половина выражения c
оценивается как true
, если c != 0
, как вы правильно догадались.
Вторая половина выражения !--c
оценивается как true
, если --c
оценивается как 0
; это происходит, когда c==1
непосредственно заранее. Более того, выражение всегда будет уменьшаться c
до тех пор, пока c != 0
, поэтому c
может служить счетчиком строк.
Когда регулярное выражение совпадает, мы устанавливаем c == N
, чтобы после ровно N
строк (каждая уменьшается на c
на 1), c==1
и awk
будут печатать строку.