Eliminar espacios de los campos en un archivo delimitado por punto y coma usando un script de shell

Eliminar espacios de los campos en un archivo delimitado por punto y coma usando un script de shell

Tengo un archivo 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;

Estoy buscando una solución para eliminar todos los espacios en blanco de cada línea csv mediante el uso seddel comando en Korn Shell y obtuve algo como esto:

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;

¿Podria ayudarme alguien por favor?

Respuesta1

Parece que desea eliminar solo los espacios que están antes o después del punto y coma. En ese 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;

Cómo funciona:

El comando de sustitución sed normalmente se parece a s/old/new/donde oldhay una expresión regular. En este caso, agregamos un gsufijo para indicarglobalsustitución (en lugar de simplemente sustituir una instancia). En nuestro caso, oldcoincide con cualquier a ;y cualquier espacio en blanco circundante: s/[[:space:]]*;[[:space:]]*. Esto se reemplaza por newel cual es solo un archivo ;.

Respuesta2

Yo contestaría perl, porque entonces puedes splity 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;

Ahora, eso elimina todos los espacios en los 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;

Pero si sólo quieres eliminar el espacio inicial/final:

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

Esto puede ser de una sola línea como:

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

Dónde:

  • -F;establece delimitador
  • -ldice eliminar/volver a agregar finales de línea automáticamente.
  • -ase divide automáticamente (en el delimitador -Fo espacio en blanco de forma predeterminada)
  • -ees "ejecutar este fragmento".

información relacionada