Ich versuche, Daten von einem Format in ein anderes zu konvertieren: Von z.B. "29. Oktober 2005" bis 2005-10-29. Ich habe eine Liste von 625 Daten. Ich benutze Awk.gawk/awk: Piping-Datum zu getline * manchmal * wird nicht funktionieren
Die Umwandlung funktioniert - die meiste Zeit. Hovewer, manchmal wird die Konvertierung überhaupt nicht passieren, und die Variable, die das (konvertierte) Datum enthalten soll, bleibt undefined.
Dies geschieht immer mit den exakt gleichen Zeilen. Running `date' explizit (aus der Bash-Shell) an den Daten dieser seltsamen Zeilen funktioniert gut (die Daten werden ordnungsgemäß konvertiert). - Es kommt nicht auf den Textinhalt dieser Zeilen an.
Warum dieses Verhalten, und wie kann ich mein Skript reparieren?
Her ist:
awk 'BEGIN { FS = "unused" } {
x = "undefined";
"date \"+%Y-%m-%d\" -d " $1 | getline x ;
print $1 " = " x
}' uBXr0r15.txt \
> bug-out-3.txt
Wenn Sie das Problem reproduzieren wollen:
- Diese Datei herunterladen: uBXr0r15.txt.
- Führen Sie das Awk-Skript aus.
- Suche nach "undefined" in Bug-out-3.txt.
("undefiniert" gefunden 122 mal, auf meinem Computer.)
Dann wieder das Skript Sie laufen konnte, und (auf meinem Computer) bug-out-3.txt unverändert bleibt - genau das Die gleichen Daten sind nicht definiert.
(Gawk Version 3.1.6, Ubuntu 9.10.)
Mit freundlichen Grüßen Magnus
Das löst mein Problem, danke. Ich brauche nicht die ursprüngliche Reihenfolge und wenn ich meine Indata neu anordne, ist das Problem auch weg - und ich spare etwas CPU, nehme ich an. (Die reale Welt indata enthält auch Nicht-Datumszeilen, so kann ich nicht 'sort 'und' uniq' verwenden, und das echte Awk-Skript ist etwas anders.) – KajMagnus
Danke, das löst auch mein Problem - ich bekam einen Fehler "Zu viele offene Dateien" und fragte mich, wie man diese "Dateien" schließen könnte, weil ich nicht wusste, dass awk Dateien für diese Pipe-Operationen verwendet. – flo
Ich bemerkte dieses Problem beim nachfolgenden Aufruf einer Funktion, um zufällig zu resedieren. –