Hallo, Am Tue, 22 Nov 2011, Andre Tann schrieb:
ich hätte da mal wieder ne Frage zu awk. Es müssen zwei Dateien zu einer vereinigt werden, und im Moment mache ich es so:
while read line; do
awk /$line/ '{ ... }' /pfad/datei2 ... done < /pfad/datei1
Daran gefällt mir nicht, daß ich awk und bash mische. Kann man das nicht auch gleich von awk erschlagen lassen?
Freilich. $ cat 1.txt ID Name ========== 1 Andre 2 Barbara $ cat 2.txt NutzerID Gegenstand ======================== 1 Telefon 1 Laptop 2 Telefon 1 DVD-Player $ gawk -f t.awk 1.txt 2.txt ID Name Gegenstände =================================== 1 Andre Telefon;Laptop;DVD-Player 2 Barbara Telefon ==== t.awk ==== #!/usr/bin/gawk -f BEGIN { getline; if( $0 ~ /ID/ ) { getline; } if( $0 ~ /^[[:space:]]*=+[[:space:]]*$/ ) { getline; } while( FNR > 1 ) { ids[$1] = $2; getline; }; } /^[[:space:]]*=+[[:space:]]*$/ { next; } { items[$1] = items[$1] ";" $2; } END { printf("%2s\t%-15s\t%s\n", "ID", "Name", "Gegenstände"); print "==================================="; for(id in ids) { sub("^[[:space:]]*;", "", items[id]); printf("%2i\t%-15s\t%s\n", id, ids[id], items[id]); } } ==== Den Dateiwechsel könne man auch daran erkennen, daß die Variable FNR wieder auf 1 springt. Dann kann man's sogar unabhängig von der Reihenfolge der Dateien machen: ==== t.awk ==== #!/usr/bin/gawk -f FNR == 1 { # wir sind bei ner neuen Datei # Datei mit Tabelle für ID -> Name? if( $0 ~ /Name/ ) { IDDATEI = 1; } else { IDDATEI = 0; } getline; next; # "===" Zeile überspringen } # ID-Tabelle einlesen IDDATEI == 1 { ids[$1] = $2; } # Gegenstand einlesen IDDATEI == 0 { items[$1] = items[$1] ";" $2; } END { printf("%2s\t%-15s\t%s\n", "ID", "Name", "Gegenstände"); print "==================================="; for(id in ids) { sub("^[[:space:]]*;", "", items[id]); printf("%2i\t%-15s\t%s\n", id, ids[id], items[id]); } } ==== $ awk -f t.awk 1.txt 2.txt ID Name Gegenstände =================================== 1 Andre Telefon;Laptop;DVD-Player 2 Barbara Telefon $ awk -f t.awk 2.txt 1.txt ID Name Gegenstände =================================== 1 Andre Telefon;Laptop;DVD-Player 2 Barbara Telefon Du mußt halt bei der Erkennung der "Id-Datei" aufpassen, daß das $0 ~ /Name/ eindeutig ist und bleibt. HTH, -dnh -- Oh, I am a C programmer and I'm okay I muck with indices and structs all day And when it works, I shout hoo-ray Oh, I am a C programmer and I'm okay [BSD fortune file] -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org