ubuntuusers.de

Liste aktualisieren

Status: Gelöst | Ubuntu-Version: Kubuntu 11.04 (Natty Narwhal)
Antworten |

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Warum soll das nicht gehen ...?

Sowohl bei awk als auch bei den neueren bash- Shells kann der Index für ein Array beliebiger Text sein.

Wenn Du also die Feldnummer anpasst, kannst Du das Skript direkt dafür nehmen. Probier es doch einfach.

LG,

track

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Die Feldnummer aus der Benennungsspalte $3, habe ich angepasst.

028	002908	STABILO ROLLERBALL 2018/36 GN			2018-36	STK	10	2	1			10							0000042119180	12	054	546	F	LAGER
028	003343	SAMSUNG TONER CLP510D7K/ELS SCHWARZ			CLP510D7K/ELS	STK	1	2	1			3							8808979362868	01	064	34	

Die LISTE-HERSTELLER-LEERZEICHEN.txt habe ich entsprechend angepasst

STABILO	SCHWAN-STABILO
STABILO	STABILO
STABILO	STABILO INTERNATIONAL GMBH
STABILO	STABILOS
SAMSUNG	SAMSUNG

Das awk-Script sieht so aus

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#! /usr/bin/awk -f
	
BEGIN { FS="\t";					      	# Eingabe-Trenner
	OFS="\t";					      	# Ausgabe-Trenner

	while(getline < "LISTE-HERSTELLER-LEERZEICHEN.txt")  {		# lies zeilenweise die Hersteller-Datei
		hersteller[$2]= $1;				# in ein Array, mit der gekürzten EAN als Index
		}
	}									


FILENAME ~ "liste028.txt"	{
	if( ($3 != "") )  {
		bezH= $3;				# Benennungspalte
		if ( (hersteller[bezH] != "") )  {
			$5= hersteller[bezH];			# wenn Hersteller in Benennung gefunden wird, dann Array in Feld 5 einsetzen
			}
		}
	print $0;						# drucken
	}

Funktioniert aber so nicht.

Was habe ich da falsch gemacht?

Grüße Nobuddy

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Funktioniert aber so nicht.

Was heißt das ...?

Macht er gar nichts, trägt er Schrott ein, gibt's 'ne Fehlermeldung ?

Bei Deinem Beispiel steht im Feld 3: "STABILO ROLLERBALL 2018/36 GN" - das ist natürlich nicht nur der Hersteller.
Wenn Deine Realdaten auch so aussehen, ist das gar kein reines Herstellerfeld, sondern die Produktbezeichnung.

track

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

track schrieb:

Funktioniert aber so nicht.

Was heißt das ...?

Macht er gar nichts, trägt er Schrott ein, gibt's 'ne Fehlermeldung ?

Hersteller wird nicht erkannt, daher auch kein Eintrag in der Herstellerspalte.

Bei Deinem Beispiel steht im Feld 3: "STABILO ROLLERBALL 2018/36 GN" - das ist natürlich nicht nur der Hersteller.
Wenn Deine Realdaten auch so aussehen, ist das gar kein reines Herstellerfeld, sondern die Produktbezeichnung.

Das habe ich ja gemeint, am Anfang der Benennungsspalte (Produktbezeichnung) suchen.

Also in "STABILO ROLLERBALL 2018/36 GN" nach "STABILO" suchen, dabei soll immer nur von links ab verglichen werden.

Nicht so "ROLLERBALL STABILO 2018/36 GN"

Grüße Nobuddy

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Das Thema hatten wir doch ganz oben schon mal: die Produktbezeichnung aufzuspalten in 2 Felder, den Hersteller und den Produktnamen.

Klar, dass Dein Skript bei der Produktbezeichnung nie ein leeres Feld findet (→ if ($3 != "") ) und folglich auch nie tätig wird.

Du müsstest erstmal verraten (oder überlegen), was Du denn jetzt überhaupt machen willst, denn leere Herstellerfelder gibt es hier ja gar nicht.
Oder ist das Feld 3 gar nicht als Hersteller-Feld gemeint ?

track

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Das Feld 3 ist das Benennungsspalte (Produktbezeichnung), also dieses

STABILO ROLLERBALL 2018/36 GN 

Die Produktbezeichnung aufspalten, so daß das erste Wort für den Vergleich verwendet wird, wäre eine Lösung.

Nur wie mache ich das innerhalb des awk-Scriptes?

Habe ja unter BEGIN den Feldtrenner \t schon angegeben und das Feld 3 hat ja " " Leerzeichen als Trenner.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Es gibt innerhalb von awk auch String-Ersetzung, mit der man alles hinter dem Leerzeichen wegschneiden kann:

hBez= gensub(" .*","",$3);

Da gibt es ein hübsches Nachschlagewerk für awk auf deutsch: http://www.ostc.de/awk.pdf
Edit: und hier noch ein recht gutes Vorlesungsskript: http://www.netzmafia.de/skripten/unix/unix9.html
(Dann kannst Du das nochmal richtig nachlesen, denn in der "Einleitung" stehen nicht alle Befehle drin)

track

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Mit

1
hBez= gensub(" .*","",$3);

funktioniert es bei mir nicht, Herstellerspalte bleibt leer.

Ich habe vorhin schon mit split herum experimentiert, habe ich hier http://spielwiese.la-evento.com/xelasblog/archives/5-Strings-bearbeiten-mit-gawk.html gesehen.

Momentan, habe ich es so

1
bezH= split($3,arr," "); printf arr[1];

, was aber dann statt in die Herstellerspalte, in die erste Spalte voran anfügt.

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Nach weiterem Herumprobieren, habe ich dies als Lösung

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#! /usr/bin/awk -f
	
BEGIN { FS="\t";					      	# Eingabe-Trenner
	OFS="\t";					      	# Ausgabe-Trenner

	while(getline < "LISTE-HERSTELLER-LEERZEICHEN.txt")  {		# lies zeilenweise die Hersteller-Datei
		hersteller[$2]= $1;				# in ein Array, mit der gekürzten EAN als Index
		}
	}									


FILENAME ~ "liste0280.txt"	{
	if( ($3 != "") )  {
		split($3,arr," ");
		bezH= arr[1];
		if ( (hersteller[bezH] != "") )  {
			$5= hersteller[bezH];			# wenn Hersteller in Benennung gefunden wird, dann Array in Feld 5 einsetzen
			}
		}
	print $0;						# drucken
	}

Funktioniert prima. ☺

So langsam, komme ich mehr und mehr dahinter ... 😉

Danke und Grüße

Nobuddy

Antworten |