Вы печатаете данные только в блоке END
. Конечно, вам нужен конечный блок, но вам также нужно печатать, когда вы доберетесь до линии ckpt
, и там уже накоплены некоторые данные. Это приводит к:
awk '/ckpt/ { if (a != "") printf "%s,%s,%s\n", a, b, c; a = $NF }
/value1/ { b = $NF }
/value2/ { c = $NF }
END { printf "%s,%s,%s\n", a, b, c }'
, который при использовании данных вашего образца дает:
ckpt.123,10,10
ckpt.234,20,25
Или вы можете даже использовать функцию для инкапсуляции печати:
awk 'function print_it() { printf "%s,%s,%s\n", a, b, c; }
/ckpt/ { if (a != "") print_it(); a = $NF}
/value1/ { b = $NF }
/value2/ { c = $NF }
END { print_it() }'
Преимущество заключается в том, что один и тот же код печати используется в обоих местах, где требуется печать.