Ich habe eine Zeile mit vielen Einträgen, darunter auch die Uhrzeit.
('DEFAULT',17,NULL,'2014-07-14 10:30:00','Something','2014-07-14 06:30:00',1),('DEFAULT',26,NULL,'2014-07-14 12:00:00','Something2,'2014-07-14 11:00:00',1),...
Ich möchte jedes Mal um ein paar Stunden erhöhen. im 24-Stunden-Format. Beispielsweise 10:30:00
würde werden 15:30:00
.
Welches ist das beste Universalwerkzeug für diese Aufgabe? Ich denke dabei an:
System-Dienstprogramme wie
awk
,sed
..& was auch immer ich nicht weißvim
Skriptsprachen wie
bash
oder Python`
Was wäre die übliche Vorgehensweise?
Antwort1
Nur um klarzustellen:
vim
ist ein Systemdienstprogramm (ein Texteditor) auf den meisten *nix-Systemen. awk
, sed
, und bash
sind Sprachen (oder Tools, je nach Kontext), die Sie zum Parsen und Ändern von Text verwenden können.
Wofür müssen Sie die Zeit erhöhen und wie oft müssen Sie sie erhöhen? Diese Faktoren beeinflussen, welche Tools Sie verwenden möchten. In jedem Fall handelt es sich um eine mehrteilige Aufgabe, VORAUSGESETZT, DIES IST KEIN SQL:
Sie gleichen zunächst Teilzeichenfolgen innerhalb einer Zeichenfolge ab. Sie können
awk
,sed
, odergrep -e
mit einem regulären Ausdruck verwenden, um diese Teilzeichenfolgen herauszuziehen.Wenn Sie diese Werte haben, konvertieren Sie sie in Ganzzahlen (oder wenn Sie eine umfassendere Sprache wie Python verwenden, können Sie sie möglicherweise mithilfe einer Bibliothek in Datums-/Uhrzeitwerte umwandeln). Sie müssen die erforderlichen Berechnungen durchführen (und ggf. eine Validierung durchführen), um diese Werte zu ändern.
Abschließend fügst du die ersetzten Werte in die Zeile ein und speicherst die geänderte Datei.
Ehrlich gesagt sieht das aber so aus sql
, also wäre es vielleicht viel einfacher, dasIntegrierte Werkzeugein dieser Sprache, um diese Werte zu ändern.
Antwort2
Es gibt einige gute Hinweise indiese AntwortVorschlag eines Weges des geringsten Widerstands unter Verwendung einer Skriptsprache wie Perl, Python, Ruby usw., die eine Vermischung von mathematischen und Matching-Operationen ermöglicht.
Hier ist ein schneller Hack mit Perl:
$ echo '2014-12-05 10:00:10, 1234, 2015-02-01 09:12:24' | perl -pe \
's/(\d{4}-\d{2}-\d{2} )(\d{2})(:\d{2}:\d{2})/join("",$1,$2+3,$3)/eg'
2014-12-05 13:00:10, 1234, 2015-02-01 12:12:24
$
In diesem vereinfachten Beispiel wird die Ziffernzeichenklasse ( \d
) gefolgt vom Wiederholungsindikator (z. B. {2}
) verwendet, um Positionskomponenten des Datums zu erfassen, und wir führen blinde Arithmetik im Stundenfeld durch. Diese Art von Lösung ist nur dann angemessen, wenn Sie Ihre Daten gut genug kennen, um sicherzustellen, dass vereinfachte Arithmetik im Stundenfeld nicht dazu führt, dass der Tag überläuft.
Time::Piece
Um dieses Problem erneut zu betrachten und die Datums-/Uhrzeitarithmetik zu korrigieren, wenn das Stundenfeld gemäß der Anregung von @Lieven überläuft, kann das Perl-Kernmodul (Perl>5.8) verwendet werden:
$ echo '2014-12-05 22:00:00, 1234, 2015-02-01 09:12:24' | \
perl -MTime::Piece -pe \
's/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/( \
Time::Piece->strptime($1, "%Y-%m-%d %T") \
+ (60*60*3))->strftime("%Y-%m-%d %T")/eg'
2014-12-06 01:00:00, 1234, 2015-02-01 12:12:24
$
Diese Beispieleingabe wurde aktualisiert, um die reibungslose Handhabung von Stundenwerten zu zeigen, die auf den nächsten Tag übertragen werden. Sie holt das Time::Piece
Modul in die Befehlszeile ein, gleicht Datum und Uhrzeit mit der Eingabe ab, konvertiert sie in Time::Piece
Objekte, um Datums-/Uhrzeitarithmetik durchzuführen, und konvertiert sie dann zurück in das gewünschte Ausgabeformat.