Como inserir uma nova linha após a primeira linha em um arquivo semelhante a ele [closed]

0

Eu converti o arquivo csv em colunas, agora quero adicionar traços sob cada rótulo da primeira linha (como foi sublinhado). com as linhas tracejadas iguais ao comprimento de cada etiqueta (os rótulos podem ser compostos por mais de uma palavra)

Aqui está um exemplo:

Full name     age    country
---------     ---    -------
    
por Mera 07.03.2017 / 18:36

2 respostas

1

Não está claro exatamente onde você deseja adicionar traços. Como você sabe que o espaço entre "Completo" e "nome" não é um separador de coluna? Para adicionar traços abaixo de cada caractere não-espaço, você pode usar este one-liner awk:

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

Para adicionar traços abaixo dos espaços, mas não abaixo das guias:

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

Para adicionar traços abaixo de tudo, exceto espaço em branco e também abaixo de espaços isolados:

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

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)

    
por 08.03.2017 / 02:12

Tags