Нет хорошего способа * сообщить awk или оболочке, что он должен буферизовать stderr, пока инструмент не завершит работу.Будьте проще и просто сделайте следующее:
awk -f script.awk file > out 2>tmp; cat tmp >> out && rm -f tmp
В противном случае вы можете буферизовать stderr самостоятельно и печатать в конце (но это будет работать только для сообщений stderr, которые вы печатаете вручную, а не для сообщений, которые генерирует сам gawk):
{
for (i=0;i<5;i++){
print $0
errs = errs $0 OFS i ORS
}
}
END {
printf "%s", errs > "/dev/stderr"
}
и затем вызовите как:
awk -f script.awk file > out 2>&1
Конечно, вам вообще не нужно использовать stderr, если это все, что вы делаете с ним, просто напечатайте в stdout.
* Там может быть какое-то тайное заклинание, которое вы можете использовать, чтобы это произошло, если планеты выравниваются определенным образом и / или у вас есть определенные инструменты или определенная оболочка, но просто придерживайтесь простого, как показано выше.