Nobuddy
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Hallo zusammen, möchte aus einer Textdatei, zeilenweise Werte abfragen. Dazu verwende ich dies 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | zeilen=$(cat "$datenbereit/$lieferant" | wc -l) # Gesamtzeilen von Produkttabelle
# Hersteller
anfangzeile=$(cat "$PWD/tabdef" | grep "$lieferantnummer" | awk -F"/t" "{print $25}")
anfangzahl=$((anfangzeile + 1))
while [ $zeilen -gt $anfangzahl ]; do
tabelle="$datenbereit/$lieferant"
Benennung=$(cat $tabelle | awk "NR == $zeilen" | awk -F"/t" '{print $3}')
...
...
...
...
...
# Nächste Zeile nach oben
zeilen=$((zeilen - 1))
done
|
, leider wird die Variable $zeilen bei NR nicht verarbeitet. Mit | Benennung=$(cat $tabelle | awk 'NR == 1' | awk -F"/t" '{print $3}')
|
funktioniert es zwar mit einer Zeile, aber ich muß sehr viele Zeilen abfragen. Kann mir jemand sagen, warum es mit meinem Konstrukt nicht funktioniert und wie es funktionieren müßte? Grüße Nobuddy
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
Hi, total umständlich. Du baust eine Schleife und bemühst den awk um eine bestimmte Zeile einer Datei herauszufischen.
Du willst eine Datei zeilenweise bearbeiten oder filtern. Dabei macht awk genau dies. awk selbst ist die Schleife und im awk sagst du, was mit bestimmten Zeilen geschehen soll. Du solltest uns mal schreiben, was du wirklich machen willst.
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Hallo theinlein, theinlein schrieb: Hi, total umständlich.
Ok, und wo ist Deine Alternative?
Du baust eine Schleife und bemühst den awk um eine bestimmte Zeile einer Datei herauszufischen.
Du willst eine Datei zeilenweise bearbeiten oder filtern.
Ich will in einer Datei, aus jeder Zeile in dieser Datei, einen bestimmte Spalte weiterverarbeiten.
Dabei macht awk genau dies. awk selbst ist die Schleife und im awk sagst du, was mit bestimmten Zeilen geschehen soll.
Ist mir jetz nicht klar, wie was Du meinst.
Du solltest uns mal schreiben, was du wirklich machen willst.
Wie oben schon geschrieben, möchte ich aus einer Datei, die in Spalten unterteilt ist, aus jeder Zeile Werte verschiedener Spalten zur Weiterverarbeitung verwenden. Dabei möchte ich die Daten zeilenweise in eine neue Datei einfügen, dies habe ich jetzt in dem Konstrukt hier nicht angegeben. Wie sieht jetzt Dein Vorschlag aus? Grüße Nobuddy
|
gunwald
Anmeldungsdatum: 12. Juli 2010
Beiträge: 218
Wohnort: /home/gunwald
|
Lieber Nobuddy, ich verstehe Deine Schleife ehrlich gesagt auch nicht. Zumal die Bedingung so nicht funktionieren kann. Wenn Du eine Datei Zeilenweise abarbeiten willst, könntest Du das zum Beispiel so machen: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | #!/bin/bash
filePath="/pfad/datei" # Datei, die durchsucht werden soll
filePathNew="/pfad/datei.new" # Datei in die geschrieben wird
while read line; do
# Einzelne Zeilen Ausgeben
echo $line
# Oder einzelne Zeilen filtern (werden nur angezeigt, wenn »Suchwort« enthalten)
echo $line | grep "Suchwort"
# Oder einzelne Zeilen in andere Datei schreiben (werden geschrieben, wenn sie »Test« enthalten)
echo $line | grep "Test" >> "$filePathNew"
done < "$filePath"
|
Ich habe aber keine Ahnung, ob ich das richtig verstanden habe. Du beschreibst nicht genau, was Du machen willst, weil Du nicht verrätst, nach welchen Kriterien Du die Tabelle filtern willst. Nach Suchworten oder Zeilennummern z. B. Grüße
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
Nobuddy schrieb: Hallo theinlein,
theinlein schrieb: awk selbst ist die Schleife und im awk sagst du, was mit bestimmten Zeilen geschehen soll.
Ist mir jetz nicht klar, wie was Du meinst.
awk ist nicht einfach so ein Filter, nicht so wie grep. Mit awk schreibt man quasi richtige Verarbeitung. BEGIN {
.... Code
}
BEDINGUNG1 {
... Code ...
}
BEDINGUNG2 {
... Code ...
}
BEDINGUNG3 {
... Code ...
}
.
.
.
END {
} awk liest Dateien zeilenweise und jede Zeile wird auf die Bedingungen geprüft, wenn die zutrifft, wird der Code im Block dahinter durchlaufen (im einfachsten Fall ist der Code ein print $xy). (BEGIN wird vor der ersten Zeile abgearbeitet, END nach der letzten Zeile).
Bedingungen können reguläre Ausdrücke sein um genau eine Zeile zu identifizieren oder es können Zeilenbereiche in der Datei identifiziert werden (Anfangsmuster, Endemuster) oder Logische Ausdrücke (z.B. auf Zeilennummer prüfen etc.)
Zeilen überspringen kann man mit 'next' - das ist so wie ein 'continue' in einer while-Schleife.
Also der awk ist prinzipiell eine Schleife. Du kannst deine Bestandteile, die du aus einer Zeile herausfischen und weiterverarbeiten willst in Variablen zwischenspeichern, verrechnen und alles Mögliche. Schreibe doch deine Verarbeitung darein und du brauchst deine umständliche Shell-Schleife nicht und kannst direkt die Tabellenfelder bearbeiten. Nobuddy schrieb: Du solltest uns mal schreiben, was du wirklich machen willst.
Wie oben schon geschrieben, möchte ich aus einer Datei, die in Spalten unterteilt ist,
aus jeder Zeile Werte verschiedener Spalten zur Weiterverarbeitung verwenden.
Dabei möchte ich die Daten zeilenweise in eine neue Datei einfügen, dies habe ich jetzt in dem Konstrukt hier nicht angegeben.
Etwas detaillierter, sonst kann man nicht mit Beispiel-Code antworten. Ansonsten einfach mal was zum awk durchlesen.
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Hallo zusammen, bin zur Zeit in einer Klinik, daher komme ich nicht so oft dazu, Euch zu antworten. Ihr habt mir da 2 Alternativen aufgezeigt, aber bevor ich auf diese eingehe, möchte ich nochmals mein Vorhaben verdeutlichen. Ich habe mehrere Dateien mit unterschiedlichem Spaltenformat, diese möchte ich in eine Datei zusammenführen. Da ich ich aber nicht alle Informationen aus diesen Dateien benötige, sind für mich nur bestimmte Spalten daraus interessant. Um das zu verdeutlichen, mal ein Beispiel. Die Spalten Artikelnummer, Benennung, Hersteller, Herstellernummer, MwSt-Gruppe, EAN-Code, Einkaufspreis und Verkaufspreis, sind für mich die relevanten Spalten. Dabei muß ich zeilenweise diese Spalten auslesen und das Zeile für Zeile, also von der ersten Zeile bis zur letzten Zeile. Manchmal gibt es auch eine Kopfzeile, diese möchte ich nicht übernehmen. 123456 Kartoffeln Bauerland 4711 1 12345678901234 7,45 9,75
789456 Kartoffelschäler Ottoland 32156 2 32658794512123 1,25 2,45
..
..
usw. Ich habe das Euch geschrieben, um sicher zu gehen, daß Ihr versteht was mein Ziel ist. Ist das mit Euren Vorschlägen so durchführbar, oder wäre die Vorgehensweise dann anderst. Danke Euch schon mal für Eure Hilfe! Grüße Nobuddy
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
Hi, was ist bei dir das "unterschiedliche Spaltenformat" ?
Sind die Spalten der verschiedenen Dateien in unterschiedlicher Reihenfolge bzw. sind gleichbedeutende Spalten an unterschiedlicher Position? Oder haben Spalten gleicher Bedeutung unterschiedliche Preis/Zahlenformate (Punkt statt Komma oder so, führende Nullen oder sowas)?
Das hieße in jedem Fall, dass du die unterschiedlichen Dateien unterschiedlich behandeln musst und zunächst irgendwie erkennen musst, welche Art Datei das sein kann. Entweder die haben alle Unterschiede in der Namensgebung / -struktur oder am Inhalt kann man (z.B. anhand der ersten Zeile oder eines Zeilenanfangs oder einem anderen Merkmal. So, wie ich das verstanden habe, willst du nur bestimmte Spalten einer Datei ausgeben. Deine gewünschten Zeilen
beginnen mit Ziffernfolge?
Das geht prinzipiell so: awk -F"\t" ' /^[0-9]+/ { printf "Spalte 3: %s - Spalte 5: %s \n",$3,$5; } ' dateiZumEinlesen.xyz Schreibt zunächst auf Standardausgabe, kannste in datei umleiten oder im awk-Scriptcode auch >> nach einem printf verwenden. oder du schreibst ein awk-Script in eine eigene Scriptdatei, die dann so aussieht: #! /usr/bin awk -f
BEGIN { FS="\t"; }
/^[0-9]+/ {
printf "Spalte 3: %s - Spalte 5: %s \n",$3,$5;
}
Die Scriptdatei nennst du je nach zu bearbeitendem Dateityp/Tabellentyp.
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
theinlein schrieb: Hi, was ist bei dir das "unterschiedliche Spaltenformat" ?
Sind die Spalten der verschiedenen Dateien in unterschiedlicher Reihenfolge bzw. sind gleichbedeutende Spalten an unterschiedlicher Position?
Die Reihenfolgen der Spalten sind unterschiedlich, bzw. Positionen der Spalten sind unter den Dateien verschieden.
Oder haben Spalten gleicher Bedeutung unterschiedliche Preis/Zahlenformate (Punkt statt Komma oder so, führende Nullen oder sowas)?
Ja, das ist auch der Fall.
Das hieße in jedem Fall, dass du die unterschiedlichen Dateien unterschiedlich behandeln musst und zunächst irgendwie erkennen musst, welche Art Datei das sein kann.
Ja, das muß ich berücksichtigen und Dateispezifisch abarbeiten.
Entweder die haben alle Unterschiede in der Namensgebung / -struktur oder am Inhalt kann man (z.B. anhand der ersten Zeile oder eines Zeilenanfangs oder einem anderen Merkmal.
Das mit der Namensgebung ist nicht relevant, wichtig ist die Spalte und die kann ich in den Dateien feststellen.
So, wie ich das verstanden habe, willst du nur bestimmte Spalten einer Datei ausgeben. Deine gewünschten Zeilen
beginnen mit Ziffernfolge?
Nein, ich möchte alle Zeilen ausgeben aber in den Zeilen eben die vordefinierten Spalten, außer die Kopfzeile. Die Zeilen in den Dateien können mit Ziefernfolge anfangen sowie mit Text, das ist unterschiedlich. Die Ordnung in ein festgelegtes Format, wie z.B. Artikelnummer - Benennung - Hersteller - Herstellernummer - MwSt-Gruppe - EAN-Code - Einkaufspreis - Verkaufspreis, kann ich ja ordnen, wenn ich die Spalten in der gewünschten Reihenfolge abrufe.
Das geht prinzipiell so: awk -F"\t" ' /^[0-9]+/ { printf "Spalte 3: %s - Spalte 5: %s \n",$3,$5; } ' dateiZumEinlesen.xyz Schreibt zunächst auf Standardausgabe, kannste in datei umleiten oder im awk-Scriptcode auch >> nach einem printf verwenden.
Das werde ich ausprobieren, nur bei dem "/^[0-9]+/" bin ich mir nicht sicher, da wird ja nach Zahlen, die am Anfang stehen gefiltert, verstehe ich das richtig? Wenn ja, könnte das ein Problem sein, da je nach Datei nicht immer Zhalen am Anfang einer Zeile stehen.
oder du schreibst ein awk-Script in eine eigene Scriptdatei, die dann so aussieht: #! /usr/bin awk -f
BEGIN { FS="\t"; }
/^[0-9]+/ {
printf "Spalte 3: %s - Spalte 5: %s \n",$3,$5;
}
Die Scriptdatei nennst du je nach zu bearbeitendem Dateityp/Tabellentyp.
Ich werde das wohl als bash-Script machen, gibt es da Geschwindigkeitsunterschiede? Grüße Nobuddy
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Was mir beim Testen von | awk -F"\t" ' /^[0-9]+/ { printf "Spalte 3: %s - Spalte 5: %s \n",$3,$5; } ' dateiZumEinlesen.xyz
|
aufgefallen ist, daß der Zeilenumbruch \n nicht funktioniert.
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
Nobuddy schrieb: Was mir beim Testen von | awk -F"\t" ' /^[0-9]+/ { printf "Spalte 3: %s - Spalte 5: %s \n",$3,$5; } ' dateiZumEinlesen.xyz
|
aufgefallen ist, daß der Zeilenumbruch \n nicht funktioniert.
Der Zeilenumbruch funktioniert. Hast du die Hochkomma auch richtig? Beachte die einfachen Hochkomma und die doppelten (Gänsefüßchen). Nobuddy schrieb: bei dem "/^[0-9]+/" bin ich mir nicht sicher, da wird ja nach Zahlen, die am Anfang stehen gefiltert,
verstehe ich das richtig?
Ich kann dir ja nur ein Beispiel geben weil, du so eine Zeile mit Ziffernfolge am Anfang als Beispiel hier hin geschrieben hast. Wenn du zum wiederholten male nicht erklärst worin sich die Dateien und Formate unterscheiden, kann dir niemand ein anderes passendes Beispiel schicken. Ist doch logisch oder? Wie willst du die Unterscheidung der Dateien lösen? Willst du von dir aus die Dateien "manuell" unterscheiden und selber verschiedene Scripte aufrufen oder soll ein Script die Dateien unterscheiden können und entsprechend durch verschiedene Filterscripte jagen? Nobuddy schrieb: Ich werde das wohl als bash-Script machen, gibt es da Geschwindigkeitsunterschiede?
Wie meinst du das? Wenn du awk aufrufst, ist das ein eigenes Programm. Auch wenn du in einem Shell Script
... awk '....'
machst, ruft die Shell genauso awk als eigenes Programm auf. Die andere Variante bewirkt eben, dass die awk Anweisungen in einer eigenen Datei stehen.
Der ausgeführte Code ist stets derselbe und wird stets vom selben Programm ausgeführt.
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
theinlein schrieb: Nobuddy schrieb: Was mir beim Testen von | awk -F"\t" ' /^[0-9]+/ { printf "Spalte 3: %s - Spalte 5: %s \n",$3,$5; } ' dateiZumEinlesen.xyz
|
aufgefallen ist, daß der Zeilenumbruch \n nicht funktioniert.
Der Zeilenumbruch funktioniert. Hast du die Hochkomma auch richtig? Beachte die einfachen Hochkomma und die doppelten (Gänsefüßchen).
Zeilenumbruch funktioniert jetzt, Danke.
Nobuddy schrieb: bei dem "/^[0-9]+/" bin ich mir nicht sicher, da wird ja nach Zahlen, die am Anfang stehen gefiltert,
verstehe ich das richtig?
Ich kann dir ja nur ein Beispiel geben weil, du so eine Zeile mit Ziffernfolge am Anfang als Beispiel hier hin geschrieben hast. Wenn du zum wiederholten male nicht erklärst worin sich die Dateien und Formate unterscheiden, kann dir niemand ein anderes passendes Beispiel schicken. Ist doch logisch oder?
Ich habe ja geschrieben, daß das Spaltenformat von Datei zu Datei unterschiedlich ist, manchmal besteht die erste Spalte aus Zahlen, manchmal aus Text. Wenn ein Kopfzeile vorhanden ist, befindet sich der immer in der ersten Zeile, daher habe ich statt "/^[0-9]+/" dies "NR > 1" verwendet.
So ist es egal, was in der ersten Spalte steht und die Kopfzeile wird nicht berücksichtigt.
Wie willst du die Unterscheidung der Dateien lösen? Willst du von dir aus die Dateien "manuell" unterscheiden und selber verschiedene Scripte aufrufen oder soll ein Script die Dateien unterscheiden können und entsprechend durch verschiedene Filterscripte jagen?
Da die gleichen Spalten in den verschiedenen Dateien an unterschiedlichen Stellen sind, werde ich wohl für jede Datei ein Konstrukt anlegen, denke das dürfte das Einfachste sein. - Ich würde noch gerne eine zusätzliche Spalte für die Lieferantennummer an der ersten Stelle in der neu erstellten Dateimachen. Die Lieferantennummer ist aber nicht in der Datei enthalten, sondern wird von mir vergeben. Fällt Dir dazu eine Lösung ein?
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Die Lösung zu meiner letzten Frage, konnte ich selber lösen, das Ergebnis sieht so aus: | zeile028=$(awk -F"\t" ' NR > 1 { printf "'$LNr' %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s \n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24; } ' "$datenbereit/$lieferant")
|
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Na, das kannst Du einfacher haben: awk 'BEGIN {OFS="\t"} {print "Lieferant", $0}' "$datenbereit/$lieferant"
Ich würde allerdings vorschlagen, dass Du die gesamte Sortiererei komplett in einem awk-Skript machst:
#! /usr/bin/awk -f
BEGIN { 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 ~ "mueller.txt" { # Beim Lieferanten Müller:
name="Müller GmbH";
print name,$4,$5,$6,$8,$9,$2; # druckt die Datenfelder in der gewünschten Reihenfolge, mit dem Lieferantennamen im 1. Feld
}
FILENAME ~ "meier.csv" { # Beim Lieferanten Meier:
name="Meier OHG";
print name,$1,$2,$3,$4,$5,$7;
}
FILENAME ~ "graf.doc" { # Beim Lieferanten Graf:
name="Graf Kartoffeltechnik";
print name,$3,$6,$5,$4,$9,$2;
} Du musst es natürlich erstmal "ausführbar" machen und dann mit allen Quelldateien im Argument aufrufen:
./filterskript ~/lieferantendaten/bereit/* > ~/lieferantendaten/sammelliste/liste.txt Danach hast Du die fertige Liste in "liste.txt" an dem entsprechenden Ort stehen. Klar, das ist jetzt erstmal nur das Schema. Aber man kann es gut anpassen, weil es recht übersichtlich ist. LG, track
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Hallo track, bisher habe ich es so hinbekommen: | # Hersteller
anfangzeile=$(cat "$PWD/tabdef" | grep "$lieferantnummer" | awk -F"/t" "{print $25}")
nullwert=""
if [ "$lieferantnummer" = "028" ]; then
zeile028=$(awk -F"\t" ' NR > $anfangszeile { printf "'$LNr' %s %s '$nullwert' '$nullwert' '$nullwert' %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\n",$1,$2,$3,$11,$23,$22,$3,$9,$8,$28,$29,$30,$31,$32,$33,$21,$5,$6,$17,$18,$1; } ' "$datenbereit/$lieferant")
echo "$zeile028" | tee -a "$datenbereit/workpool.txt"
exit 0
fi
|
Hier werden die Spalten so in der Reihenfolge ausgegeben, wie ich es benötige. Die Lieferantennummer befindet sich in der ersten Spalte. Die Spalten 3 bis 5 werden leer gelassen, da diese bei diesem Lieferant nicht vorhanden sind. Leider habe ich das Problem, daß die Datei des Lieferanten ca. 18.000 Zeilen hat, aber nur ca. 9.000 Zeilen verarbeitet werden. Gibt es da evtl. eine Beschränkung bei txt-Dateien? - Deinen Vorschlag mit dem awk-Script habe ich gemacht und sieht für den Anfang so aus: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | #! /usr/bin/awk -f
lieferproduktpool="/home/whtb/Privatpost/lieferaktuell/lieferaktuell";
datenbereit="/home/whtb/Privatpost/Import_out";
BEGIN { 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,$1,"\n"; # druckt die Datenfelder in der gewünschten Reihenfolge, mit dem Lieferantennamen im 1. Feld
}
|
Auch hier wieder, die Lieferantennummer in der ersten Spalte, sowie Spalten 3 bis 5 werden leer erzeugt. Nach dem Aufruf im Terminal | cd /zum/scriptpfad
./scriptnamen /pfad/zur/lieferantendatei > /ort/fuer/neue/datei
|
erhalte ich dieses Ergebnis: 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
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
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
028 000178 Sigel Fotopapier 26,23 0252 q Fotopapier 052 02 N N N N C IP721 VE50 N N 000178
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
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
028 000186 Sigel Fotopapier 8,17 0252 l Fotopapier 052 02 N N N N C IP661 VE20 Y N 000186
Wie Du siehst, werden Zeilen doppelt ausgegeben und das Spaltenformat stimmt nicht. Fällt Dir da ein Fehler in meinem awk-Script dazu auf? Grüße Nobuddy
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
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. 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 ? track
|