Schnellste Möglichkeit zum Suchen und Ersetzen in einer großen Datei beim Ersetzen eines in einer anderen Datei vorhandenen Felds

Schnellste Möglichkeit zum Suchen und Ersetzen in einer großen Datei beim Ersetzen eines in einer anderen Datei vorhandenen Felds

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 OPUM04181Check1|^/h1/h2/h3in 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

verwandte Informationen