2016-08-02 25 views
2


Eine resultierende Datei, die Werte aus verschiedenen XML-Dateien enthält.
Die Datei hat 5 Spalten getrennt durch ";" falls alle Muster übereinstimmen.
Erste Spalte = neutral Index
Zweite Säule = spezifischer Index1
Dritte Spalte = Datei Index1
vierte Spalte = spezifische Index2
Fünfte Spalte enthält = Datei mit Index2 Index2
Nicht passenden Mustern enthält (wie im letzten drei Zeilen) sollten auch 5 Spalten haben, während die letzten zwei Spalten wie die ersten beiden Zeilen sein sollten.
Die sortierten Dateien wie folgt aussieht:Spaltentrennzeichen vor Muster in eine sortierte Datei auf einem Mac einfügen

AAA;AAA.1D1;file_X;AAA.2D1;file_Y 
AAA;AAA.1E1;file_A;AAA.2E1;file_B 
AAA;AAA.2F1;file_C 
BBB;BBB.2G1;file_D 
CCC;CCC.1B1;file_H 
YYY;YYY.2M1;file_N 


Das gewünschte Ergebnis wäre:

AAA;AAA.1D1;file_X;AAA.2D1;file_Y 
AAA;AAA.1E1;file_A;AAA.2E1;file_B 
AAA;;;AAA.2F1;file_C 
BBB;;;BBB.2G1;file_D 
CCC;CCC.1B1;file_H;; 
YYY;;;YYY.2M1;file_N 


Wenn Sie eine Idee/Tipp haben, ist Ihre Hilfe zu schätzen! Danke im Voraus!

Antwort

2

aktualisiert Antwort

Im Lichte der aktualisierten Forderung, ich glaube, Sie so etwas wie dies wollen:

awk -F';' 'NF==3 && $2~/\.1/{$0=$0 ";;"} 
      NF==3 && $2~/\.2/{$0=$1 ";;;" $2 ";" $3} 1' file 

die als Einzeiler geschrieben werden kann:

awk -F';' 'NF==3 && $2~/\.1/{$0=$0 ";;"} NF==3 && $2~/\.2/{$0=$1 ";;;" $2 ";" $3} 1' YourFile 

Ursprüngliche Antwort

ich tun würde, dass mit awk:

awk -F';' 'NF==3{$0=$1 ";;;" $2 ";" $3}1' YourFile 

AAA;AAA.1D1;file_X;AAA.2D1;file_Y 
AAA;AAA.1E1;file_A;AAA.2E1;file_B 
AAA;;;AAA.2F1;file_C 
BBB;;;BBB.2G1;file_D 
YYY;;;YYY.2M1;file_N 

Das sagt ... „mit ';' als Feldtrenn awk auf YourFile laufen. Wenn nur 3 Felder in einer Zeile vorhanden sind, erstellen Sie die Zeile mit dem vorhandenen ersten Feld, drei Semikolons und dann den anderen beiden Feldern neu. Die 1 am Ende bedeutet die aktuelle line` drucken“.

Wenn Sie awk nicht viel nutzen, NF auf die Anzahl der Felder verweist, $0 auf die gesamte aktuelle Zeile, $1 auf das erste Feld verweist auf der Linie, $2 bezieht sich auf das zweite Feld usw.

+0

Danke! Es funktioniert.Ich habe immer versucht, die passende Linie durch die Suche nach dem Muster * .2 * und auch awk, aber immer scheitern. Vielen Dank. Kurz und effizient! Danke für die ausführliche Erklärung! – adamerikus

+0

Nur mit allen Dateien getestet und denke, ich muss es in Bezug auf das Muster *.1* undanpassenweil ich jetzt den Aspekt sehe, dass ich auch Einträge wie CCC;CCC.1B1;file_H habe, die in CCC;CCC.1B1;file_H;; umgewandelt werden sollten. – adamerikus

+0

Es ist wirklich schwierig, formatierte Daten im Abschnitt * comments * zu lesen. Bitte klicken Sie auf "Bearbeiten" unter Ihrer ursprünglichen Frage und aktualisieren Sie die Eingabedaten und Ergebnisdaten, um die Dateien besser widerzuspiegeln, dann werde ich versuchen, die Antwort entsprechend zu aktualisieren. –