причина лишних пробелов в том, что вы не установили OFS
.
вот другое решение
$ echo "hello world" | awk '{sub(/^./,toupper(substr($1,1,1)))}1'
Hello world
или расширение вашего решения
$ echo "hello world" | awk 'BEGIN{FS=""} {sub($1,toupper($1))}1'
Hello world
без перезаписи $0
сохранит исходный формат.