2017-05-22 4 views
-4

Irgendwelche Ideen wie die folgenden mit awk?Mit awk Wie kombiniere ich Daten in zwei Dateien und ersetze Werte aus der zweiten Datei in die erste Datei?

zwei Eingabedateien, data.txt und keys.txt:

data.txt enthält einige Daten:

A;1 
B;2 
A;3 

keys.txt enthält "-Taste; Wert" -Paare ("C" ist in dieses Beispiel nicht Teil data.txt, aber der awk-Skript sollte immer noch funktionieren):

A;30 
B;20 
C;10 

die Ausgabe wie folgt sein soll:

A;1;30 
B;2;20 
A;3;30 

Daher sollte jede Zeile in data.txt, die einen beliebigen Schlüssel aus keys.txt enthält, den entsprechenden Wert an die Zeile in data.txt angehängt bekommen.

+3

Stackoverflow ist kein kostenloser Code-Schreibservice. Wenn Sie versucht haben, etwas zu schreiben und Schwierigkeiten zu haben, dann zeigen Sie, was Sie getan haben, und stellen Sie eine spezifische Frage. Siehe http://stackoverflow.com/help/how-to-ask für Tipps. Wenn Sie nur freie Arbeit erledigen wollen, ist StackOverflow nicht der richtige Ort für solche Anfragen. Lernen Sie, Ihren Code selbst zu schreiben oder jemanden zu bezahlen, um ihn für Sie zu schreiben. – ghoti

+0

gefragt und beantwortet eine Million Mal auf dieser Seite, herumstochern .... –

+0

Warum letzte Ausgabe ist nicht "A; 3; 30"? – karakfa

Antwort

1

awk zur Rettung!

übernimmt die zweite Datei eindeutige Schlüssel anders als erste Datei hat (wenn Sie nicht angeben müssen, was dann passiert)

$ awk 'BEGIN {FS=OFS=";"} 
     NR==FNR {a[$1]=$2; next} 
     $1 in a {print $0,a[$1]}' file2 file1 

A;1;30 
B;2;20 
A;3;30 

ps. Notieren Sie sich die Reihenfolge der Dateien ...

+0

@Karafka danke für die Antwort, es ist nicht genau die Ausgabe, nach der ich war, habe ich die ursprüngliche Frage aktualisiert, um zu versuchen, es genauer zu machen. – Markus

+0

Wenn Sie das Problem nicht beschreiben können, ist es sinnlos, nach einer Antwort zu suchen ... – karakfa

+0

@karafka Wenn es in keys.txt keinen Schlüssel gibt, der mit einigen Zeilen in data.txt übereinstimmt, wie würden Sie einen Standardwert anhängen Wert von "1" für diese Zeilen in data.txt? – Markus

1

awk Lösung:

awk -F';' 'NR==FNR{a[$1]=$2; next}{if($1 in a) $0=$0 FS a[$1]; print}' file2 file1 

Der Ausgang:

A1;1;2 
A2;2;1 
A3;3;0.5 
A1;1;2 
A2;2;1 
A3;3;0.5 

  • NR==FNR - die erste Datei die Verarbeitung d.h. file2

  • a[$1]=$2 - zusätzliche Werte für jeden Schlüssel Akkumulieren

  • if($1 in a) $0=$0 FS a[$1] - Wert anhängen, wenn erste Spalte entspricht

+0

Danke für die Antwort, aber es funktioniert nicht vollständig, klärte ich die ursprüngliche Frage. – Markus

+0

@Markus, ich sehe kein Problem dort. Die Ausgabe ist wie in deiner Frage. Überprüfen Sie, ob Sie keine Tippfehler gemacht haben, oder Sie haben die Reihenfolge der Dateien verwechselt – RomanPerekhrest

+0

ja danke, die Ausgabe war korrekt nach der Frage, aber ich habe ein minimalistisches Beispiel gemacht. Für größere Daten (ich habe gerade die ursprüngliche Frage mit etwas mehr Daten aktualisiert) bekomme ich die awk-Lösung nicht zum Laufen. – Markus

Verwandte Themen