2017-06-13 10 views
1

diese Quelle vor:awk - analysieren Text gleiche Zeichen in Feldern als Trennzeichen mit

field1;field2;"data;data field3";field4;"data;data field5";field6 
field1;"data;data field2";field3;field4;field5;"data;data field6" 

Wie Sie sehen können, das Feldtrennzeichen verwendet wird, innerhalb bestimmter Felder, eingeschlossen zwischen ". Ich kann nicht direkt mit awk analysieren, weil es keine Möglichkeit gibt, unerwünschte Spaltung zu vermeiden, zumindest habe ich keinen Weg gefunden. Außerdem haben diese speziellen Felder eine variable Position innerhalb einer Zeile und sie können einmal, zweimal, viermal usw. vorkommen.

Ich dachte an eine Lösung mit einem vorbereitenden Schritt, wobei ich die ; in diesen Feldern durch a Code irgendeiner Art. Das Problem ist, dass sed/awk gierigen REGEX übereinstimmen. Im obigen Beispiel kann ich also nur ; innerhalb des letzten in Anführungszeichen eingeschlossenen Feldes in jeder Zeile ersetzen.

Wie kann ich jede Instanz von Anführungszeichen abgleichen und die spezifischen ; in ihnen ersetzen? Ich will nicht perl oder python usw.

+1

, was es ist, dass Sie einmal yo tun wollen Hast du die Felder getrennt? und warum willst du 'perl' nicht benutzen? es ist nur ein anderes Werkzeug wie 'awk', das in der Befehlszeile verwendet werden kann ... mit' GNU awk' können Sie https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content verwenden .html # Splitting-By-Content – Sundeep

Antwort

3

gnu awk verwenden können Sie in speziellen FPAT Variable verwenden, um einen regulären Ausdruck für Ihre Felder zu haben.

können Sie diesen Befehl verwenden, um alle ; von | innerhalb der doppelten Anführungszeichen zu ersetzen:

awk -v OFS=';' -v FPAT='"[^"]*"|[^;]*' '{for (i=1; i<=NF; i++) gsub(/;/, "|", $i)} 1' file 

field1;field2;"data|data field3";field4;"data|data field5";field6 
field1;"data|data field2";field3;field4;field5;"data|data field6" 
+1

Ich hatte keine Ahnung von 'FPAT' als Möglichkeit, Felder nach dem zu definieren, was sie sind, anstatt dem, was sie nicht sind, wie das normalerweise verwendete' -F'. Das ist großartig, ich kann meine Quelle direkt mit dieser Methode analysieren. Vielen Dank! –

2

Als Alternative zu FPAT können Sie die awkFS setzen doppelte Anführungszeichen zu sein, und dann tauschen für Semikolon Trennzeichen jedes zweite Feld:

awk -F"\"" '{for(i=1;i<=NF;++i){ if(i%2==0) gsub(/;/, "|", $i)}} {print $0}' yourfile 

Hier awk ist:

  1. Splitting der Datensatz durch doppelte Anführungszeichen (-F"\"")
  2. durch jedes Feld Looping, dass es ({for(i=1;i<=NF;++i))
  3. Prüfung der Feldordnungs mod 2, wenn es 0 (if(i%2==0))
  4. findet Wenn es selbst dann ist es Swaps aus den Semikolons mit Rohren (gsub(/;/, "|", $i))
  5. Drucke aus dem transformierten Datensatz ({print $0})
Verwandte Themen