Se o seu arquivo fosse um arquivo separado por vírgula, esse código faria o que você precisa durante a conversão inicial de vírgula separada em espaços separados e trataria os campos separados por espaços corretamente, pois o delimitador é vírgula:
awk 'BEGIN{FS=",";OFS=" "};
NR==1{
for (i=1;i<=NF;i++)
{
dashes=gensub(/./,"-","G",$i);
(h1 =="")?h1=$i:h1=h1 OFS $i;
(h2=="")?h2=dashes:h2=h2 OFS dashes;
};
{print h1;print h2}
}
NR>1{
$1=$1;print
}' <<<$'name1,name2,full name3,name4\nvalue1,value2,value3,value4'
name1 name2 full name3 name4
----- ----- ---------- -----
value1 value2 value3 value4
Se o seu arquivo for separado por espaço, será difícil manipular campos com espaços.
Na realidade, esses campos espaçados como "nome completo" serão tratados como dois campos diferentes.
Ajustando BEGIN{FS=OFS=" "}
no código anterior e alimentando o awk, um arquivo separado por espaço será impresso
name1 name2 full name3 name4
----- ----- ---- ----- -----
value1 value2 value3 value4
Dica: Para gerar tantos traços quanto o comprimento de cada campo, basta inserir o mesmo campo (ou seja, nome1) em uma segunda linha de cabeçalho abaixo da linha de cabeçalho original e substituir cada caractere de cada campo por um traço. Isso resulta em uma sequência tracejada de comprimento igual para cada campo de cabeçalho principal (por exemplo, o nome1 se torna ----- com função gensub)