Неясно, где именно вы хотите добавить тире - откуда вы знаете, что пробел между полями «Полный» и «имя» не является столбцом разделитель? Чтобы добавить тире под каждым непробельным символом, вы можете использовать эту однострочную строку awk:
awk '{print} NR==1 {gsub(/[^\t ]/, "-"); print}'
Чтобы добавить тире под пробелами, но не под табуляцией:
awk '{print} NR==1 {gsub(/[^\t]/, "-"); print}'
Чтобы добавить тире под всем, кроме пробелов, а также под одиночными пробелами:
awk '{print} NR==1 {gsub(/[^ \t]/, "-"); while (sub(/- -/, "---")) {}; print}'
Если ваш файл был файлом с разделителями-запятыми, то этот код сделает то, что вам нужно во время первоначального преобразования из файла с разделителями-запятыми в файл с разделителями-пробелами, и будет правильно обрабатывать поля, разделенные пробелами, поскольку разделителем является запятая:
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
Если ваш файл разделен пробелами, то трудно обрабатывать поля с пробелами.
В действительности поля с пробелами, такие как "полное имя", будут обрабатываться как два разных поля.
Отрегулировав BEGIN{FS=OFS=""}
в предыдущем коде и скормив awk файл с пробелами будет выведен
name1 name2 full name3 name4
----- ----- ---- ----- -----
value1 value2 value3 value4
Совет: Чтобы создать столько тире, сколько длина каждого поля, я просто вставляю то же поле (например, name1) во вторую строку заголовка ниже исходной строки заголовка и заменяю каждый символ каждого поля тире. Это приводит к пунктирной строке равной длины для каждого поля основного заголовка (т.е. name1 становится ----- с помощью функции gensub)
.