Gravar indo para a próxima linha em um arquivo separado por PIPE

2

Eu tenho um arquivo separado por pipe com o formato algo como abaixo

1|ABC|11|DEF|111
2|ABC|22|PQR
ST
UW|222
3|ABC|33|XYZ|333
4|ABC|44|LMN|444

Agora, para a linha que começa com 2 quando tento inserir esse registro na tabela, o registro é inserido apenas até PQR e comece a inserir o registro da linha que inicia 4

Eu apreciaria se houvesse algum comando para trazer todo o registro da linha 2 para uma única linha, o que me ajudaria a inserir a linha 2 na tabela com sucesso?

    
por 3DM 02.06.2016 / 00:03

2 respostas

1

Para substituir novas linhas incorporadas em registros com espaços usando o GNU awk .

num_fields=4
awk -v RS='([^|]*\|){'"$num_fields"'}[^|]*\n' '
  {
   n = split(RT, a,"|"); 
   for (i=1; i<=n; ++i)
   {
      gsub("\n", " ", a[i]); 
      printf "%s%s", a[i], i==n?"\n":"|"
   }
  }' file

Isso dá

1|ABC|11|DEF|111 
2|ABC|22|PQR ST UW|222 
3|ABC|33|XYZ|333 
4|ABC|44|LMN|444 

O truque aqui é usar o suporte do GNU awk para separadores de registros arbitrários para definir um como quatro campos terminados por pipe seguido por um campo terminado por nova linha, sem nenhum campo para conter os tubos incorporados (via RS='([^|]*\|){4}[^|]*\n' ).

O separador de registro real que responde a essa especificação é acessível por meio de RT . É uma simples questão de dividir RT por canal em uma matriz a , removendo novas linhas incorporadas de cada elemento de a e finalmente reconstruindo o registro ao re-concatenar elementos de a

    
por 02.06.2016 / 03:35
0

Uma maneira de pegar as peças desse formato de arquivo insano é com o Perl.

#!/usr/bin/perl
#
use warnings;
use strict;

undef $/;
my $file = <>;

while ($file =~ /^(.*?\|.*?\|.*?\|.*?\|.*?)$/mscg) {
    my $fields = $1;
    $fields =~ s/\n(.)/\n$1/sg;
    print "$fields\n";
}

O código armazena o arquivo inteiro na memória e, em seguida, o rebloqueia em cinco campos| -delimited por linha. As novas linhas incorporadas são substituídas por \n .

Se o script fosse chamado repipe.pl , você poderia usá-lo para processar um arquivo chamado datafile as perl repipe.pl datafile .

Se você está se sentindo desafiado, você pode incorporá-lo como um verso como este, mas não fará muito pela manutenção:

perl -e 'undef $/; $file = <>; while ($file =~ /^(.*?\|.*?\|.*?\|.*?\|.*?)$/mscg) { $fields = $1; $fields =~ s/\n(.)/\n$1/sg; print "$fields\n"; }' datafile

Aqui está a saída resultante do seu arquivo de dados de amostra

1|ABC|11|DEF|111
2|ABC|22|PQR\nST\nUW|222
3|ABC|33|XYZ|333
4|ABC|44|LMN|444
    
por 02.06.2016 / 01:13

Tags