Entfernen von Leerzeichen aus den Feldern in einer durch Semikolon getrennten Datei mithilfe eines Shell-Skripts

Entfernen von Leerzeichen aus den Feldern in einer durch Semikolon getrennten Datei mithilfe eines Shell-Skripts

Ich habe eine CSV-Datei wie diese:

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;

Ich suche nach einer Problemumgehung, um alle Leerzeichen aus allen CSV-Zeilen zu entfernen, indem ich sedden Befehl in der Korn-Shell verwende, und habe ungefähr Folgendes erhalten:

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;

Kann mir bitte jemand helfen?

Antwort1

Es sieht so aus, als ob Sie nur die Leerzeichen entfernen möchten, die vor oder nach einem Semikolon stehen. In diesem Fall:

$ 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;

Wie es funktioniert:

Der sed-Ersetzungsbefehl sieht normalerweise so aus, s/old/new/wobei es oldsich um einen regulären Ausdruck handelt. In diesem Fall fügen wir ein gSuffix hinzu, um anzuzeigenweltweitErsetzung (im Gegensatz zur Ersetzung nur einer Instanz). In unserem Fall oldentspricht jedes a ;und jedes umgebende Leerzeichen: s/[[:space:]]*;[[:space:]]*. Dies wird durch ersetzt, newwas einfach ein ist ;.

Antwort2

Ich würde abholen perl, denn dann können Sie splitund 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;

Dadurch werden alle Leerzeichen aus den Feldern entfernt. Das Ergebnis ist:

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

Wenn Sie jedoch nur führende/nachfolgende Leerzeichen entfernen möchten:

s/^\s+|\s+$//g für @fields;

Dies kann wie folgt in eine Zeile zusammengefasst werden:

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

Wo:

  • -F;setzt Trennzeichen
  • -lsagt, Zeilenenden automatisch entfernen/erneut hinzufügen.
  • -awird automatisch aufgeteilt ( -Fstandardmäßig auf dem Trennzeichen in oder Leerzeichen)
  • -elautet „Führen Sie diesen Snippet aus“.

verwandte Informationen