Regex zum Verbinden von Feldern in einer CSV

Regex zum Verbinden von Feldern in einer CSV

Ich habe eine CSV-Datei mit über 2 Millionen Datensätzen im folgenden Format.

path;name;extension;size;date;user    
/foo/;difacs;cgi;3,795;18-07-2011;Unix User\pads
/foo/;difacs.cgi;bak;2,622;03-12-2009;Unix User\pads
/foo/test/kzt/netcdfSample/testing/;zzz;;401;27-07-2006;Unix User\kzt
/foo/test/kzt/netcdfSample/vic_netcdf_popup/;a;txt;1,832;17-02-2006;Unix User\kzt

Ich muss Pfad, Name und Erweiterung in einem korrekt formatierten Feld zusammenführen.

path;size;date;user    
/foo/difacs.cgi;3,795;18-07-2011;Unix User\pads
/foo/difacs.cgi;bak;2,622;03-12-2009;Unix User\pads
/foo/test/kzt/netcdfSample/testing/zzz/;401;27-07-2006;Unix User\kzt
/foo/test/kzt/netcdfSample/vic_netcdf_popup/a.txt;1,832;17-02-2006;Unix User\kzt

Dank im Voraus!

Antwort1

Dies ist eine Variante der Antwort von slhck, die ordnungsgemäß mit einem leeren Erweiterungsfeld umgeht (und das falsche Ersetzen eines Punkts vermeidet, der möglicherweise absichtlich im zweiten oder dritten Feld vorhanden war):

sed 's/^\([^;]*\);\([^;]*\)/\1\2/;ta;:a;s/^[^;]\+;;/&/;t;s/;/./' inputfile

Es ist nicht notwendig, eine dritte Erfassungsgruppe zu verwenden. Diese Antwort funktioniert auch ohne sie. Es ist nicht notwendig, den Punkt auf der rechten Seite des Ersetzungsbefehls zu maskieren.

Hier ist eine Erklärung meines Skripts:

  • Erfassen Sie die ersten beiden Felder, ausschließlich der Semikolons, die sie trennen.
  • ta;:a- wenn ein erfolgreicher Ersatz durchgeführt wurde, dann verzweigen Sie zum Label :a, das unmittelbar folgt - dies löscht effektiv das "Erfolg"-Flag
  • s/^[^;]\+;;/&/- Ersetzen Sie eine Folge von Nicht-Semikolons, gefolgt von zwei Semikolons (die aneinandergereihten ersten und zweiten Felder, gefolgt von einem leeren dritten Feld), durch sich selbst. Dies ist kein gültiger Befehl, setzt aber das Flag „Erfolg“.
  • t- wenn die letzte Ersetzung erfolgreich war (das dritte Feld ist leer), gehe zum Ende der Verarbeitung der aktuellen Zeile (da kein Label angegeben wurde)
  • s/;/./- wenn wir an diesen Punkt gekommen sind (das dritte Feld warnichtleer), ersetzen Sie das Semikolon durch einen Punkt.

verwandte Informationen