Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
track schrieb: Nobuddy schrieb: Leider habe ich das Problem, daß die Datei des Lieferanten ca. 18.000 Zeilen hat, aber nur ca. 9.000 Zeilen verarbeitet werden.
Das sieht mir verdächtig nach dem bekannten mawk- Problem aus. (→ http://forum.ubuntuusers.de/topic/boese-falle-mit-awk-mawk/ ) Probier erstmal, ob Du damit das Problem gelöst kriegst.
Habe gawk nachinstalliert und bei "awk -W version" Kommt dann auch GNU awk. Leider ändert das aber daran nichtś, daß nur nur ca. 9.000 statt 18.000 Zeilen in die neue Datei übertragen werden. Könnte evtl. auch an einen vermurksten Datensatz (Zeile) liegen, daß er dann dort abbricht, nur bei 18.000 Zeile diese zu finden (wenn es daran läge), ist wohl wie die Nadel im Heuhaufen.
Sonst: Deinen Vorschlag mit dem awk-Script habe ich gemacht ... ...Wie Du siehst, werden Zeilen doppelt ausgegeben und das Spaltenformat stimmt nicht.
So direkt sehe ich keinen Fehler. (außer dass das "\n" am Zeilenende Unsinn ist. Der print-Befehl enthält schon einen Zeilenvorschub) Kannst Du mir nicht einen Muster-Datensatz posten (die ersten 10 Originalzeilen oder so), damit ich den Fehler nachvollziehen kann ?
Klar, das kann ich machen, siehe hier:
product_code product_desc MwSt Alt-BestNr Range Group Katalogpreis Einkaufspreis Per Pack Herst-Nr FlgPreis FlgStück FlgBeschr FlgNeu FlgProdÄn.d Page Item Klasse Sector EAN VE PE FlgFreiblebend FlgDirekt FlgZusätzlich FlgAbverkauf Staffelmenge1 Staffel1EK Staffel1VK Staffelmenge2 Staffel2EK Staffel2VK FlgPromo PromoEnde
000178 Sigel Fotopapier 2seit IP721 VE50 2 02 052 33,95 26,23 1 1 IP721 N N N N N 61 C q 0252 4004360998324 1 PCK N N N N N
000186 Sigel Fotopapier glz IP661 VE20 2 02 052 10,49 8,17 1 1 IP661 N N Y N N 61 C l 0252 4004360998270 1 PCK N N N N N
000194 Sigel Fotopapier glz IP659 VE20 2 02 052 8,29 6,47 1 1 IP659 N N N N N 61 C l 0252 4004360998249 1 PCK N N N N N
000217 Sigel Fotopapier smatt IP608 VE50 2 02 052 23,95 18,31 1 1 IP608 N N N N N 61 C q 0252 4004360994845 1 PCK N N N N N
000241 Sigel Fotopapier smatt IP672 VE20 2 02 052 18,79 12,86 1 1 IP672 N N N N N 61 D r 0252 4004360997006 1 PCK N N N N N
000275 Sigel Fotopapier glz IP664 VE100 2 02 052 28,95 22,37 1 1 IP664 N N N N N 61 C q 0252 4004360996863 1 PCK N N N N N
000291 Herma CD-Etiketten 5115 V=50 2 694430 02 026 10,95 7,36 1 1 5115 N N N N N 999 w 0226 4008705051156 50 PCK N N N N N
000322 Falken Papier Superjet A4 VE500 2 02 085 5,89 3,89 1 1 superjet N N Y N N 52 E r 0285 500 PCK Y N N N 5 3,71 5,39 50 3,66 4,99 N
000330 Falken TCF-Papier A4 VE500 2 02 085 5,89 4,05 1 1 exclusive N N N N N 52 F q 0285 4014481402495 500 PCK Y N N N 5 3,92 5,29 50 3,88 4,99 N
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Ja - jetzt beim Test sehe ich es: Du hast insgesamt 2 richtige Fehler und das sinnlose "\n" drin:
In den Zeilen 3 und 4 stehen vermeintliche Variablenzuweisungen. Allerdings stehen die nicht innerhalb {geschweifter Klammern} und damit nicht in einem Anweisungsblock. Wahrscheinlich bedeuten sie eine Adresszuweisung oder sonstwas. Da ist awk empfindlich und macht wilde Sachen. (ich kann Dir nicht mal sagen was) → Beseitige die beiden Zeilen (oder schreibe geschweifte Klammern darum herum) und der Unsinn hört auf. Da Du die Variable "FS" offen gelassen hast, ist für ihn alles was Whitespace heißt ein Worttrenner. Also auch die Leerzeichen im Produktnamen. Ich vermute, Du willst nur die TABs als Eingangstrenner haben - dann musst Du ihm das auch (im BEGIN-Block) verraten: BEGIN { FS="\t"; # Tabulator als Eingabe-Trenner
OFS="\t" } # Tabulator als Ausgabe-Trenner einstellen Das "\n" am Ende ist Quatsch, wie ich schon geschrieben hatte. Deshalb ist jede 2. Zeile leer.
Ohne die Fehler macht das Skript dann auch ungefähr was es soll ... 😉 LG, track
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Ja, so ist es auch, funktioniert jetzt prima. 👍 Sieht einfacher aus, als mit bash. Bei Variablen, wird auch kein $ davor gestellt, ist wirklich einfach gehalten. Werde mir mal nach einer schönen deutschsprachigen Anleitung für awk schauen. Wie kann ich das, was ich jetzt noch über das Terminal mache, also dies | ./scriptnamen ~/ort/zu/lieferantendatei/* > ~/ort/zu/zieldatei/liste.txt
|
also, so daß ich nur noch das awk-Script ohne Zusatz aufrufe. Am Besten wäre, wenn ich "tee -a" verwenden könnte, oder etwas ähnliches bei awk. Damit könnte ich dann andere Lieferantendateien, in die gleiche Zieldatei einfügen. Hast Du mir da einen Tip, weiß nicht wie das bei awk funktioniert? Grüße Nobuddy
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
"awk - eine Einführung" war bisher immer bei der Uni Magdeburg zu haben: http://webcache.googleusercontent.com/search?q=cache:OKusqSTFuUgJ:www.uni-magdeburg.de/urzs/awk/+awk+eine+einf%C3%BChrung&cd=6&hl=de&ct=clnk&client=ubuntu&source=www.google.com Jetzt gibt es die Seite offenbar bei der Uni Kassel: http://www.uni-kassel.de/fb16/neuronale_netze/downloads/Unix_Tools/awk.html Den Aufruf mit den Quelldateien kannst Du nicht einsparen. Er muss schließlich die Dateinamen per Shell-Expansion einsammeln, und ohne Parameter würde awk von stdin lesen. Wie Du mehrere Dateien der Reihe nach abarbeiten kannst, hatte ich oben ja schon geschrieben. Das einzige, was Du noch in das awk- Skript hineinziehen kannst, ist die Umleitung in die Zieldatei: print LNr,$1,$2,nullwert,nullwert,nullwert,$3,$11,$23,$22,$3,$9,$8,$28,$29,$30,$31,$32,$33,$21,$5,$6,$17,$18,$1; > "~/ort/zu/zieldatei/liste.txt" (wenn Du willst, kannst Du mit mehreren print natürlich auch verschiedene Dinge in verschiedene Dateien drucken)
track
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
track schrieb: "awk - eine Einführung" war bisher immer bei der Uni Magdeburg zu haben: http://webcache.googleusercontent.com/search?q=cache:OKusqSTFuUgJ:www.uni-magdeburg.de/urzs/awk/+awk+eine+einf%C3%BChrung&cd=6&hl=de&ct=clnk&client=ubuntu&source=www.google.com Jetzt gibt es die Seite offenbar bei der Uni Kassel: http://www.uni-kassel.de/fb16/neuronale_netze/downloads/Unix_Tools/awk.html
Danke für die Links, die werde ich mir in Ruhe durchlesen.
Den Aufruf mit den Quelldateien kannst Du nicht einsparen. Er muss schließlich die Dateinamen per Shell-Expansion einsammeln, und ohne Parameter würde awk von stdin lesen. Wie Du mehrere Dateien der Reihe nach abarbeiten kannst, hatte ich oben ja schon geschrieben.
Ja, habe gerade nochmal mir das angeschaut, das Prinzip ist ja daher einfach.
Das einzige, was Du noch in das awk- Skript hineinziehen kannst, ist die Umleitung in die Zieldatei: print LNr,$1,$2,nullwert,nullwert,nullwert,$3,$11,$23,$22,$3,$9,$8,$28,$29,$30,$31,$32,$33,$21,$5,$6,$17,$18,$1; > "~/ort/zu/zieldatei/liste.txt"
Das habe ich versucht, allerdings funktioniert es bei mir dann nicht mehr.{{{#!code bash
#! /usr/bin/awk -f
{ lieferproduktpool="~/Privatpost/lieferaktuell"; } # Ziel
{ datenbereit="~/Privatpost/Import_out"; } # Quelle
BEGIN { FS="\t"; # Tabulator als Eingabe-Trenner einstellen
OFS="\t" } # Tabulator als Ausgabe-Trenner einstellen
FNR == 1 { next } # überspringe die 1. Zeile bei allen Dateien
# (falls es Dateien ohne Kopfzeile gibt, müsste man das noch anpassen)
FILENAME ~ "028.txt" { # Preisliste SPICERS:
LNr="028";
nullwert="";
print LNr,$1,$2,nullwert,nullwert,nullwert,$3,$11,$23,$22,$3,$9,$8,$28,$29,$30,$31,$32,$33,$21,$5,$6,$17,$18; > "datenbereit/loto.txt" # druckt die Datenfelder in der gewünschten Reihenfolge, mit dem Lieferantennamen im 1. Feld
}
}}}(wenn Du willst, kannst Du mit mehreren print natürlich auch verschiedene Dinge in verschiedene Dateien drucken)
Würde das funktionieren, wenn ich den Aufruf | ./scriptnamen ~/ort/zu/lieferantendatei/* > ~/ort/zu/zieldatei/liste.txt
|
über ein Script laufen lasse? Grüße Nobuddy
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Ja klar kannst Du den Befehl auch in ein Shellskript rein schreiben. Das ist ja so bei Shellskripten, dass die Befehle darin genau so ausgeführt werden als wenn sie auf der Konsole eingetippt worden wären. (gleiche Shell mal vorausgesetzt) track
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Ja, habe es gerade gemacht, funktioniert prima. Jetzt werde ich mir mal die Links anschauen, bevor ich weiter mache. Mal schauen, was da alles möglich ist. Danke mal vorerst. 👍 Grüße Nobuddy
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Nachtrag: Ich sehe jetzt erst Deine andere Frage, die im Codeblock versackt war. Bei dem print-Befehl hatte ich noch einen Fehler drin, darum ging es nicht. Das ";" vor der Umleitung gehört da nicht hin, sondern ganz ans Ende. Richtig ist: print LNr,$1,$2,nullwert,nullwert,nullwert,$3,$11,$23,$22,$3,$9,$8,$28,$29,$30,$31,$32,$33,$21,$5,$6,$17,$18,$1 > "~/ort/zu/zieldatei/liste.txt ;" Und außerdem solltest Du die Variablen-Zuweisungen besser in den BEGIN-Block setzen, dann werden sie nur 1x vorher und nicht jedes Mal bei jeder neuen Zeile ausgeführt: BEGIN { FS="\t"; # Tabulator als Eingabe-Trenner
OFS="\t"; # Tabulator als Ausgabe-Trenner einstellen
lieferproduktpool="~/Privatpost/lieferaktuell"; # Ziel
datenbereit="~/Privatpost/Import_out"; # Quelle
}
track
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Hallo track, mit mehreren Lieferantendateien in einem awk-Script, habe ich noch meine Probleme und hoffen, daß Du mir da weiterhelfen kannst. Vorweg habe ich ein paar Dinge hinzugefügt, bei denen mir aber nicht klar ist, wie dies in einem awk-Script umgesetzt werden muß. Momentan sieht es so aus: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 | #! /usr/bin/awk -f
BEGIN { FS="\t"; # Tabulator als Eingabe-Trenner einstellen
OFS="\t"; # Tabulator als Ausgabe-Trenner einstellen
datenbereit="~/Privatpost/Import_out"; # Quelle
}
{ ok028=(ls "datenbereit" | grep "028.txt") } # Lieferant 1
{ ok048=(ls "datenbereit" | grep "048.txt") } # Lieferant 2
# 1
if ( "ok028" = "028.txt" ) return
FNR == 1 { next } # überspringe die 1. Zeile bei allen Dateien
# (falls es Dateien ohne Kopfzeile gibt, müsste man das noch anpassen)
FILENAME ~ "028.txt" { LNr="028";
nullwert="";
print LNr,$1,$2,nullwert,nullwert,nullwert,$3,$11,$23,$22,$3,$9,$8,$28,$29,$30,$31,$32,$33,$21,$5,$6,$17,$18; # druckt die Datenfelder in der gewünschten Reihenfolge, mit dem Lieferantennamen im 1. Feld
}
# 2
if ( "ok048" = "048.txt" ) return
FNR == 0 { next } # überspringe die 1. Zeile bei allen Dateien
# (falls es Dateien ohne Kopfzeile gibt, müsste man das noch anpassen)
FILENAME ~ "048.txt" { LNr="048";
nullwert="";
print LNr,$1,$2,nullwert,nullwert,nullwert,$3,$11,$23,$22,$3,$9,$8,$28,$29,$30,$31,$32,$33,$21,$5,$6,$17,$18; # druckt die Datenfelder in der gewünschten Reihenfolge, mit dem Lieferantennamen im 1. Feld
}
|
Mit diesem | { ok028=(ls "datenbereit" | grep "028.txt") } # Lieferant 1
{ ok048=(ls "datenbereit" | grep "048.txt") } # Lieferant 2
|
frage ich in dem Verzeichnis "datenbereit", die Lieferantendateien ab. Ist z.B. die Datei 028.txt vorhanden, soll dies über die if-Abfrage geregelt werden. | # 1
if ( "ok028" = "028.txt" ) return
FNR == 1 { next } # überspringe die 1. Zeile bei allen Dateien
# (falls es Dateien ohne Kopfzeile gibt, müsste man das noch anpassen)
FILENAME ~ "028.txt" { LNr="028";
nullwert="";
print LNr,$1,$2,nullwert,nullwert,nullwert,$3,$11,$23,$22,$3,$9,$8,$28,$29,$30,$31,$32,$33,$21,$5,$6,$17,$18; # druckt die Datenfelder in der gewünschten Reihenfolge, mit dem Lieferantennamen im 1. Feld
}
|
Hier habe ich auch "FNR == 1 { next }" angebracht, da es auch Lieferantendateien ohne Kopfzeile gibt und ich es so Fall für Fall einstellen kann. - So ist zumindest meine Vorstellung. Ob sich das auch so verwirklichen läßt oder ich völlig daneben liege, hoffe ich von Dir zu erfahren. Grundsätzlich funktioniert es so zumindest jetzt noch nicht, da bestimmt einige Fehler drin sind. - Ich weiß, habe mir auch schon überlegt, für jede Lieferantendatei ein awk-Script zu erstellen und die ganzen awk-Scripte über ein bash-Script anzusteuern, was für mich im Moment bestimmt einfacher wäre. Grüße Nobuddy
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Was wird das denn ....? Wie soll das arme awk mit Shellcode zurechtkommen - das ist doch keine bash ! Wie man es richtig macht, hatte ich Dir schon ganz oben geschrieben. Du kannst einfach direkt den aktuellen Dateinamen abfragen und damit verzweigen:
#! /usr/bin/awk -f
BEGIN { FS="\t"; # Tabulator als Eingabe-Trenner
OFS="\t"; # Tabulator als Ausgabe-Trenner einstellen
FILENAME ~ "028.txt" { # Beim Lieferanten 028:
FNR == 1 { next } # überspringe nur hier die 1. Zeile
LNr="028";
print LNr,$1,$2,"","","",$3,$11,$23,$22,$3,$9,$8,$28,$29,$30,$31,$32,$33,$21,$5,$6,$17,$18;
}
FILENAME ~ "048.txt" { # Beim Lieferanten 048:
LNr="048";
print LNr,$1,$2,"","","",$3,$11,$23,$22,$3,$9,$8,$28,$29,$30,$31,$32,$33,$21,$5,$6,$17,$18;
} Natürlich musst Du beim Aufruf dem Skript alle relevanten Dateien übergeben:
./awkskript ~/Privatpost/Import_out/0*.txt > ~/Privatpost/Import_out/workpool.txt (da expandiert der Shellbefehl automatisch den "*" zu gültigen Namen) track
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Hallo track, bin in einer Klinik und hatte die letzten Tage keinen WLAN-Zugang mehr. Ich habe für jede Lieferantendatei eine eigenes awk-Script erstellt, das über ein bash-Script angesteuert wird. Grund für die Erstellung der einzelnen awk-Scripte war, daß ich die Lieferantendateien einzeln und gezielt über eine if-Anfrage, diese dann bearbeiten kann. Ich habe mich schon ein wenig bei awk durchgelesen, dabei bin ich auf gsub gestoßen, das ja direkt in der Datei die Änderung vornimmt. Habe da auch schon ein wenig herumprobiert, konnte aber die Funktion nicht umsetzen. Könntest Du mir vielleicht ein Beispiel aufzeigen, mit gsub in einer Spalte Änderungen vornehmen die mit einer if-Abfrage gekoppelt ist, damit ich eine Anhaltspunkt habe? Grüße und Danke vorab Nobuddy
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Hallo zusammen, habe jetzt mal was versucht. Ziel ist es bei der Spalte Herstellernummer, enthaltene Sonderzeichen wie "-_:/." und Leerzeichen zu entfernen. Mein Konstrukt sieht folgendermaßen 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"; # Tabulator als Eingabe-Trenner einstellen
OFS="\t"; # Tabulator als Ausgabe-Trenner einstellen
}
FNR == 1 { next } # überspringe die 1. Zeile bei allen Dateien
# (falls es Dateien ohne Kopfzeile gibt, müsste man das noch anpassen)
# Herstellernummer, entfernen von Sonder- u. Leerzeichen $6
FILENAME ~ "liste028.txt" { gsub("-", "", $6);
gsub(" ", "", $6);
gsub("/", "", $6);
gsub("_", "", $6);
gsub(":", "", $6);
++++ gsub("\.", "", $6); ++++
print;
}
END { exit 0 }
|
Das Ganze funktioniert soweit, bis auf die letzte Zeile, die ich markiert habe. Da es in manchen Herstellernummern auch Punkt gibt, möchte ich auch diese entfernen. Wie funktioniert das, daß man Punkte in einer bestimmten Spalte entfernen kann? Wenn mein Konstrukt etwas umständlich ist, würde ich mich über Eure Vorschläge freuen! Grüße Nobuddy
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Hallo zusammen, was die Variablen in awk betrifft, wäre das geklärt. Deshalb setze ich mal diesen Thread auf gelöst. Zu weiteren Fragen, werde ich zu gegebener Zeit einen neuen Thread aufmachen. Danke an alle Beteiligten! 👍 Grüße Nobuddy
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Nobuddy schrieb: Ziel ist es bei der Spalte Herstellernummer, enthaltene Sonderzeichen wie "-_:/." und Leerzeichen zu entfernen. ... Das Ganze funktioniert soweit, bis auf die letzte Zeile, die ich markiert habe.
Das ist wieder so eine Tücke mit den Escapes, die beim Bearbeiten durch die Kommandozeile "aufgebraucht" werden. Anscheinend auch hier. In einem ausdrücklichen awk-Skript müsste Deine Version ja funktionieren, aber auf der Kommandozeile nicht. Da probier mal:
track@lucid:~$ echo "1-2 3.4:5" | awk '{gsub("\\.","",$0);print$0}'
1-2 34:5 Da gsub Reguläre Ausdrücke als Suchmuster benutzt, kannst Du den Punkt einfach in eine Klasse kapseln. Dann bist Du das blöde escapen los:
track@lucid:~$ echo "1-2 3.4:5" | awk '{gsub("[.]","",$0);print$0}'
1-2 34:5 oder Du fasst gleich alle Ersetzungen in einer Klasse zusammen: #! /usr/bin/awk -f
BEGIN { FS="\t"; # Tabulator als Eingabe-Trenner
OFS="\t"; # Tabulator als Ausgabe-Trenner
}
FNR == 1 { next } # überspringe die 1. Zeile bei allen Dateien
# Herstellernummer, entfernen von Sonder- u. Leerzeichen $6
FILENAME ~ "liste028.txt" { gsub("[- /_:.]", "", $6);
print;
} LG, track
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Hallo track, Danke für Deine Antwort. track schrieb: Nobuddy schrieb: Ziel ist es bei der Spalte Herstellernummer, enthaltene Sonderzeichen wie "-_:/." und Leerzeichen zu entfernen. ... Das Ganze funktioniert soweit, bis auf die letzte Zeile, die ich markiert habe.
Das ist wieder so eine Tücke mit den Escapes, die beim Bearbeiten durch die Kommandozeile "aufgebraucht" werden. Anscheinend auch hier. In einem ausdrücklichen awk-Skript müsste Deine Version ja funktionieren, aber auf der Kommandozeile nicht. Da probier mal:
track@lucid:~$ echo "1-2 3.4:5" | awk '{gsub("\\.","",$0);print$0}'
1-2 34:5
Ich mache das ja über ein awk-Script, oder verstehe ich da falsch? Da gsub Reguläre Ausdrücke als Suchmuster benutzt, kannst Du den Punkt einfach in eine Klasse kapseln. Dann bist Du das blöde escapen los: track@lucid:~$ echo "1-2 3.4:5" | awk '{gsub("[.]","",$0);print$0}'
1-2 34:5
Wenn ich das in eine Klasse kapsele, dann funktioniert mein obiges awk-Script-Konstrukt.
oder Du fasst gleich alle Ersetzungen in einer Klasse zusammen: #! /usr/bin/awk -f
BEGIN { FS="\t"; # Tabulator als Eingabe-Trenner
OFS="\t"; # Tabulator als Ausgabe-Trenner
}
FNR == 1 { next } # überspringe die 1. Zeile bei allen Dateien
# Herstellernummer, entfernen von Sonder- u. Leerzeichen $6
FILENAME ~ "liste028.txt" { gsub("[- /_:.]", "", $6);
print;
}
So, funktioniert das bei mir nicht. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | #! /usr/bin/awk -f
BEGIN { FS="\t"; # Tabulator als Eingabe-Trenner einstellen
OFS="\t"; # Tabulator als Ausgabe-Trenner einstellen
}
FNR == 1 { next } # überspringe die 1. Zeile bei allen Dateien
# (falls es Dateien ohne Kopfzeile gibt, müsste man das noch anpassen)
# Hauptabelle "liste.txt"
# Lieferant
FILENAME ~ "liste.txt" { gsub("[.:-_/ ]", "", $6); # Herstellernummer, entfernen von Sonder- u. Leerzeichen $6
print;
}
END { exit 0 }
|
Erhalte da die Fehlerausgabe: Fatal: Ungültiges Bereichsende: /[.:-_ ]/
Wenn ich aber es so mache: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | #! /usr/bin/awk -f
BEGIN { FS="\t"; # Tabulator als Eingabe-Trenner einstellen
OFS="\t"; # Tabulator als Ausgabe-Trenner einstellen
}
FNR == 1 { next } # überspringe die 1. Zeile bei allen Dateien
# (falls es Dateien ohne Kopfzeile gibt, müsste man das noch anpassen)
# Hauptabelle "liste.txt"
# Lieferant
FILENAME ~ "liste.txt" { gsub(" ", "", $6); # Herstellernummer, entfernen von Sonder- u. Leerzeichen $6
gsub("[.]", "", $6);
gsub(":", "", $6);
gsub("-", "", $6);
gsub("_", "", $6);
gsub("/", "", $6);
print;
}
END { exit 0 }
|
funktioniert es prima. Kannst Du mir vielleicht sagen, warum das so ist? Grüße Nobuddy
|