Removendo espaços dos campos em um arquivo delimitado por ponto-e-vírgula usando o shell script

1

Eu tenho um arquivo csv como este:

03139; 5;        IT1234978208; 20150930  ;  CTZ 13/31.12.15;
03137; 6;        IT1234978206; 20151015  ;  CTZ 13/31.11.18;
....
....
03134; 8;        IT1234974406; 20151212  ;  CTZ 13/37.13.17;

Estou procurando uma solução alternativa para remover todos os espaços em branco de todas as linhas csv usando o comando sed no Korn Shell para algo assim:

03139;5;IT1234978208;20150930;CTZ 13/31.12.15;
03137;6;IT1234978206;20151015;CTZ 13/31.11.18;
....
....
03134;8;IT1234974406;20151212;CTZ 13/37.13.17;

Alguém poderia me ajudar, por favor?

    
por Micheal Bolton 22.05.2016 / 19:46

2 respostas

6

Parece que você deseja remover apenas os espaços antes ou depois de um ponto e vírgula. Nesse caso:

$ sed 's/[[:space:]]*;[[:space:]]*/;/g' text
03139;5;IT1234978208;20150930;CTZ 13/31.12.15;
03137;6;IT1234978206;20151015;CTZ 13/31.11.18;
....
....
03134;8;IT1234974406;20151212;CTZ 13/37.13.17;

Como funciona:

O comando de substituição do sed normalmente se parece com s/old/new/ , em que old é uma expressão regular. Nesse caso, adicionamos um sufixo g para indicar a substituição global (em vez de apenas substituir uma instância). No nosso caso, old corresponde a qualquer ; e qualquer espaço em branco ao redor: s/[[:space:]]*;[[:space:]]* . Isso é substituído por new , que é apenas um ; .

    
por 22.05.2016 / 20:30
0

Eu seleciono perl , porque você pode split e join :

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

while ( <DATA> ) {
   chomp;
   my @fields = split /;/; 
   s/\s+//g for @fields;
   print join ";", @fields, "\n";
}

__DATA__
03139; 5;        IT1234978208; 20150930  ;  CTZ 13/31.12.15;
03137; 6;        IT1234978206; 20151015  ;  CTZ 13/31.11.18;
03134; 8;        IT1234974406; 20151212  ;  CTZ 13/37.13.17;

Agora, isso retira todos os espaços nos campos, dando:

03139;5;IT1234978208;20150930;CTZ13/31.12.15;
03137;6;IT1234978206;20151015;CTZ13/31.11.18;
03134;8;IT1234974406;20151212;CTZ13/37.13.17;

Mas se você quiser apenas separar o espaço inicial / final:

s / ^ \ s + | \ s + $ // g para @fields;

Isso pode fazer uma linha como:

perl -F; -lape 's/^\s+|\s+$//g for @F; print join ";", @F;'

Onde:

  • -F; define delimitador
  • -l diz remover / adicionar novamente os finais de linha automaticamente.
  • -a é autosplit (no delimitador em -F ou espaço em branco por padrão)
  • -e é "executar este trecho".
por 24.05.2016 / 10:22