Как вставить новую строку после первой в файл, похожий на него [закрыто]

0
08.03.2017, 01:33
2 ответа

Неясно, где именно вы хотите добавить тире - откуда вы знаете, что пробел между полями «Полный» и «имя» не является столбцом разделитель? Чтобы добавить тире под каждым непробельным символом, вы можете использовать эту однострочную строку awk:

awk '{print} NR==1 {gsub(/[^\t ]/, "-"); print}'

Чтобы добавить тире под пробелами, но не под табуляцией:

awk '{print} NR==1 {gsub(/[^\t]/, "-"); print}'

Чтобы добавить тире под всем, кроме пробелов, а также под одиночными пробелами:

awk '{print} NR==1 {gsub(/[^ \t]/, "-"); while (sub(/- -/, "---")) {}; print}'
1
28.01.2020, 02:34

Если ваш файл был файлом с разделителями-запятыми, то этот код сделает то, что вам нужно во время первоначального преобразования из файла с разделителями-запятыми в файл с разделителями-пробелами, и будет правильно обрабатывать поля, разделенные пробелами, поскольку разделителем является запятая:

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)

.
1
28.01.2020, 02:34

Теги

Похожие вопросы