Unir linhas usando o editor Vim

1

Eu tenho um arquivo de texto muito longo com os dados repetidos como este

510068893                                     
510069716                                     
620087756                                     
510068729                                     
620089710                                     
560034147                                     
510069875

M                                                      
M                                                   
M
M                                                      
M                                                   
M                                                
M

1957
5/2/1980
1960
1978
5/8/1988
1984
1981

ABASSI FADHIL KHAMIS
ABDALLA HAMAD JUMA
ABDALLA ALI MAHADHI
ABDALLA ALI MFAKI
ABDALLA HAMAD KHAMIS
ABDALLA JUMA ALI
ABDALLA JUMA MABROUK

Sokoni                                                 
Sokoni                                                
Sokoni                                                
Sokoni                                                
Sokoni                                                
Sokoni                                                
Sokoni

510068695                                     
510068680                                     
620086828                                     
560034266                                     
620088288                                     
560033477                                     
510068873

M                                                      
M                                                   
M
M                                                      
M                                                   
M                                                
M

5/10/1983
1985
1937
1951
1974
14/5/1984
1987

ABDALLA KHAMIS ALI
ABDALLA KHAMIS HAMAD
ABDALLA KHAMIS USHURU
ABDALLA MOHAMMED JUMA
ABDALLA MOHAMMED SALEH
ABDALLA OMAR ABEID
ABDALLA OMAR NUHU

Sokoni                                                 
Sokoni                                                
Sokoni                                                
Sokoni                                                
Sokoni                                                
Sokoni                                                
Sokoni

Quero juntar-me a cada primeira linha de cada grupo para formar uma linha e repetir para cada segunda linha de cada grupo até terminar. Como posso fazer isso usando o script Vim ou Perl?

A saída deve se parecer com

510068893, M, 1957, ABASSI FADHIL KHAMIS, Sokoni 510069716, M, 5/2/1980, ABDALLA HAMAD JUMA, Sokoni
620087756, M, 1960, ABDALLA ALI MAHADHI, Sokoni 510068729, M, 1978, ABDALLA ALI MFAKI, Sokoni
etc.
    
por user3136941 13.04.2015 / 10:26

4 respostas

1

Caso haja sempre dados para coletar 7 entradas (mais uma linha em branco), esse programa awk coletará os dados respectivos e os imprimirá no final:

awk '{a[NR%8]=a[NR%8]" "$0} END{for (i=1;i<=7;i++) print a[i]}'

(Note que suas amostras de dados parecem ter muitos espaços em branco, mas se você quiser aqueles espaços em branco removidos em vez de juntados, por favor ajuste sua pergunta apropriadamente, então eu ajustarei minha resposta de acordo.)

Editar: para criar os delimitadores de vírgulas, como na saída de exemplo do comentário acima, use:

awk '{a[NR%8]=a[NR%8]", "$0} END{for (i=1;i<=7;i++) print substr(a[i],3)}'
    
por 13.04.2015 / 10:45
0
gawk ' BEGIN{RS=""; FS="\n"}
            {for(i=1;i<NF;i++) {a[i]=a[i]" || "$i} } 
       END  {for(i in a){ print a[i]}}'

(esta solução pode mudar a ordem das linhas; a próxima versão continua ordem de linha).

Melhor ainda, melhore-o e crie um comando reutilizável "vert_transpose"

#!/usr/bin/gawk -f

BEGIN {RS=""; FS="\n"}
l<=NF {l=NF}
      {for(i=1;i<=NF;i++) { a[i]=a[i]" || "$i } } 
END   {for(i=1;i<=l ;i++) { print a[i]        } }

chmod e instale-o em algum $HOME/bin ; e sempre necessário usá-lo como comando comum:

  • no bash: vert_transpose longfile
  • dentro do vim: :%! vert_transpose
por 13.04.2015 / 11:23
0

Para remover espaços à direita de cada linha e adicionar linhas vazias no final:

sed 's/\s*$//;$a\' very.long.text.file

que pode ser canalizado através de

awk '
BEGIN{
 RS="\n\n"
 FS="\n"}
{for (i=1;i<=NF;i++)
     A[i]=A[i] s $i
 s=","}
NR%5==0{
 for(i in A)
     printf "%s,%g\n" ,A[i]
 s=""
 delete A
 print s}'

que esvazia a memória em cada 40 linhas para adequar-se a arquivos grandes.

    
por 13.04.2015 / 12:36
0

Use Ctrl + V para habilitar o bloco visual e selecionar as linhas a serem unidas, então pressione Shift + J (ou seja, capital J ) para mesclar as linhas em uma única linha.

    
por 01.02.2017 / 05:44