
Ich habe zwei Dateien. Datei1 ist eine CSV-Datei mit 60 Feldern:
111,Check1|^/h1/h2/h3,22062014184500,20,0.....
111,Check2|^/h43/h40/h9,22062014184500,4,.....
111,Check3|^/h1/h3/h4,22062014184500,0,0,.....
Datei2 ist eine Zuordnungsdatei:
OPUM04181,Check1|^/h1/h2/h3
OPUM04040235,Check3|^/h1/h3/h4
OPUM04051898,Check2|^/h43/h40/h9
Was ich jetzt tun muss, ist, in Feld 2 der Datei 1 das Feld durch das Feld 1 der Datei 1 zu ersetzen, das mit Feld 2 übereinstimmt. Beispiel:
Jetzt muss ich Feld 2 von Datei1 durch Feld 1 der Zeile in Datei2 ersetzen, die mit Feld 2 übereinstimmt. Beispiel:
In Datei1:
111,Check1|^/h1/h2/h3,22062014184500,20,0.....
wird sein
111,OPUM04181,22062014184500,20,0.....
wobei OPUM04181
↔ Check1|^/h1/h2/h3
in Datei2 abgebildet ist.
Meine Einschränkung besteht darin, dass Datei1 und Datei2 nicht den gleichen Wertesatz haben; ihre Anzahl ist unterschiedlich. Außerdem beträgt die Zeilenanzahl für beide Dateien 3 Millionen.
Das habe ich versucht:
- Ich habe eine Schleife ausgeführt, die Feld 2 in Datei1 berücksichtigt
- Ich habe überprüft, ob dieses Feld in Datei2 vorhanden ist.
- Falls vorhanden, habe ich das Feld 1 in Datei2 genommen.
- Ich habe das Feld2 in Datei1 durch ersetzt
sed s///g
. Aber das nimmt enorm viel Zeit in Anspruch.
Außerdem kann ich Datei1 nicht sortieren.
Was ist eine schnellere Methode?
Antwort1
awk -F, -v OFS=, '
NR==FNR {opu[$2]=$1; next}
$2 in opu {$2 = opu[$2]; print}
' file2 file1
Dadurch wird die „Mapping“-Datei in den Speicher gelesen und anschließend das 2. Feld für Datei1 ersetzt. Jede Datei wird genau einmal verarbeitet.
Die Ausgabe geht an stdout. Um die Datei also "an Ort und Stelle" zu ersetzen,
awk ... file2 file1 > tempfile && mv tempfile file1