AWK - Script hilfe gesucht

S

Sk8

Grünschnabel
Hallo,

ich habe ein kleines Problem. Ich habe 2 Dateien die ich zusammenführen muss. Ein Feld aus Datei2 muss in Datei1 an die passende Zeile angefügt werden. Leider habe ich keine andere Möglichkeit gefunden dies zu tun, ausser mit AWK und davon habe ich leider keine Ahnung :hilfe2:

Aufbau von Datei1
Eindeutige 7-stellige Nummer am Anfang der Zeile. Die restlichen Felder sind durch ein "|" getrennt.
Bsp:
1234567|Feld2|Feld3|usw.
1120567|Feld2|Feld3|usw.

Aufbau von Datei2
Eindeutige 7-stellige Nummer am Anfang der Zeile. Die auch in Datei1 vorkommt. Datei2 hat nur noch ein zusätzliches Feld welche, wie oben genannt, in Datei1 in die Zeile mit der passenden Nummer angefügt werden soll.
Bsp:
1234567|Feld2|

Das Ergebnis sollte dann wie folg aussehen:
5634335|Feld2|Feld3|usw.
1234567|Feld2|Feld3|usw.|Feld2 aus Datei2|
1120567|Feld2|Feld3|usw.

Kann mir jemand weiterhelfen? ?(

Mfg und Danke schonmal.
 
Soweit ich weiss, arbeitet awk nur immer auf einer Datei. Vermutlich ist perl fuer Dich das bessere Werkzeug, v.a., wenn die Zeilenanzahl unterschiedlich ist. Wenn sie es nicht ist, koenntest Du die Dateien erstmal sortieren, dann mit paste in eine Datei schreiben:
Code:
sort -n -k1 -t "|" Datei1 > sorted1
sort -n -k1 -t "|" Datei2 > sorted2
paste sorted1 sorted2 > merged
awk -f "|" '{print $1 $2 usw $X}' merged
wobei Du das X in '$X' mit der Spalte ersetzen musst, in der nun die Spalte 2 aus Datei 2 liegt. Geht nur, wenn jede Zeile aus Datei1 die gleiche Anzahl vonSpalten hat.
 
Leider ist es nicht so, dass beide Dateien die gleiche Anzahl an Zeilen haben.

In Datei1 stehen etwa 400000 Zeilen +/- 100000 und in Datei2 etwa 8000 Zeilen +/- 1000

Perl kann ich ja noch weniger ich bin doch SQL`ler und in diesen speziellen Fall muß ich es vermeiden mit tmp-tables zu arbeiten ;( Aber mir war so als hätte ich gelesen, dass awk sowas kann.
 
Ja, Du hast recht. Folgendermassen koennte es gehen:
Code:
awk -F "|" '{ if (FILENAME=="Datei1") { array[$1] = $0} else { array[$1] = array[$1] "|" $2 }  } END { for (f in array) { print array[f] }}' Datei1 Datei2
Das ganze solltest Du vermutlich in eine dritte Datei umleiten, damit nicht 400000 Zeilen an Dir vorbeiflimmern.
 
Hmmm, eine kleine Sache ist mir noch aufgefallen :oldman
Lasse ich das Skript auf Linux laufen, funzt alles perfekt. Wenn ich
es aber auf AIX Unix laufen lasse, verliere ich in der neu erzeugten Datei
etwa 100 Zeilen. Weiß da einer was? Unterschiedliche Version o.ä.?
 
Hast Du denn die Versionen der aufgerufenen Kommandos schonmal verglichen (Linux und AIX)?
 
Auf Linux ist es die Version 3.1.3 und auf der Unix war
es mir nicht möglich die Version zu bestimmen, aber
die Datei awk ist von 2001.

MfG
 
Hast Du die Möglichkeit einen aktuellen GNU-awk zu installieren?
 
Hi,

so, nun ist wieder ein kleines Problem aufgetaucht, bei dem ich :hilfe2: gebrauchen könnte.

Folgender Code wurde mir freundlicherweise von rikola erstellt.

Code:
awk -F "|" '{ if (FILENAME=="Datei1") { array[$1] = $0 } else { array[$1] = array[$1] $2 "|" }  } END { for (f in array) { print array[f] }}' Datei1 Datei2 >  Datei3

Hier wird, wenn was gefunden wird, ein Feld in Datei1, aus Datei2, angefügt.
Wenn aber nichts gefunden wird, wird auch nichts angefügt, aber es müsste zumindest ein "|" angefügt werden, dass ich hier ein leeres Feld habe. Habe schon ein paar Sachen ausprobiert, aber mit meinen fast nicht vorhandenen AWK-Kenntnissen komme ich da nicht weiter.

Bsp. wie die Ausgabe dann aussehen sollte:
Feld1|Feld2||
Feld1|Feld2|FeldausDatei2|
Feld1|Feld2||

Danke schonmal

MfG
 

Ähnliche Themen

awk: Dateiinhalt/Variableninhalt als Teil einer if-Anweisung

Zurück
Oben