Beste Möglichkeit, Zahlen in einer Zeile in Linux zu erhöhen

Beste Möglichkeit, Zahlen in einer Zeile in Linux zu erhöhen

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:00würde werden 15:30:00.

Welches ist das beste Universalwerkzeug für diese Aufgabe? Ich denke dabei an:

  1. System-Dienstprogramme wie awk, sed..& was auch immer ich nicht weiß

  2. vim

  3. Skriptsprachen wie bashoder Python`

Was wäre die übliche Vorgehensweise?

Antwort1

Nur um klarzustellen:

vimist ein Systemdienstprogramm (ein Texteditor) auf den meisten *nix-Systemen. awk, sed, und bashsind 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:

  1. Sie gleichen zunächst Teilzeichenfolgen innerhalb einer Zeichenfolge ab. Sie können awk, sed, oder grep -emit einem regulären Ausdruck verwenden, um diese Teilzeichenfolgen herauszuziehen.

  2. 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.

  3. 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::PieceUm 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::PieceModul in die Befehlszeile ein, gleicht Datum und Uhrzeit mit der Eingabe ab, konvertiert sie in Time::PieceObjekte, um Datums-/Uhrzeitarithmetik durchzuführen, und konvertiert sie dann zurück in das gewünschte Ausgabeformat.

verwandte Informationen