Como posso dividir uma linha em duas linhas se o tamanho for maior que 7 usando awk? [fechadas]

2

Por exemplo, eu só queria imprimir algo assim na linha de comando. Vamos dizer que eu tenho um arquivo chamado file.txt.

 What is life?
 how are you?
 hi
 whatup
 this is more than

E eu quero imprimi-lo na linha de comando usando o awk, mas se o número de caracteres for maior que 7, a saída deve ficar assim.

 What is 
 life?
 how are 
 you?
 hi
 whatup
 this is
 more than

Então, basicamente, quando eu uso o awk, se o número de caracteres for maior que 7, divida a linha em duas linhas na saída.

    
por Sarah 12.05.2016 / 14:14

4 respostas

10

Enquanto você pode fazer isso em awk :

$ awk '{sub(/.{8}/,"&\n"); print}' file
What is
life?
how are
you?
hi
whatup
this is
more than

realmente não é a melhor ferramenta para o trabalho. Você poderia fazer a mesma coisa mais simplesmente com:

$ fold -sw 8 file
What is 
life?
how are 
you?
hi
whatup
this is 
more 
than

Você também pode usar o Perl:

$ perl -pe 's/.{8}/$&\n/' file
What is 
life?
how are 
you?
hi
whatup
this is 
more than
    
por 12.05.2016 / 14:30
6

Você pode usar awk , conforme oferecido em outras respostas, mas também pode usar fmt

fmt -s -w8 file
What is
life?
how are
you?
hi
whatup
this
is more
than
    
por 12.05.2016 / 14:51
2

com

awk 'length < 7 { print ; next ; } 
         { printf "%s\n%s\n",substr($0,0,7),substr($0,8) }' file.txt

o resultado é

What is
 life?
how are
 you?
hi
whatup
this is
 more than

para pular o uso do char branco

awk 'length < 7 { print ; next ; } 
    { printf "%s\n",substr($0,0,7) ; 
      i=8 ; while (substr($0,i,1) == " " ) i++; printf "%s\n",substr($0,i) }'
    
por 12.05.2016 / 14:34
1

Para obter a saída desejada com sed :

$ sed -e 's/.\{7\} /&\
/' <file
What is 
life?
how are 
you?
hi
whatup
this is 
more than

Como o oitavo caractere na sua entrada é sempre espaço, então isso funcionou.

Se você quiser quebrar no 7º caractere, independentemente do 8º:

$ sed -e 's/./\
&/8' <file
    
por 12.05.2016 / 14:29