Gibt es ein Tool in Solaris UNIX (so dass kein GNU-Tool verfügbar ist), um Daten zu subtrahieren? Ich weiß, dass wir unter Linux gawk
ein Datum von einem anderen subtrahieren können. Aber in Solaris haben wir ein Maximum von nawk
(verbessertawk
) dem keine Datumsberechnungen durchgeführt werden können. Ich kann auch kein Perl benutzen.
Gibt es eine Möglichkeit, Datumsberechnungen durchzuführen 20100909 - 20001010
?
UPDATE: Kann ich Datumsberechnungen bc
durchführen?
Antworten:
Hier ist ein Awk-Skript, das ich gerade geschrieben habe und das mit einem POSIX-Awk funktionieren sollte. Sie müssen die Solaris-Version ausprobieren. Denken Sie daran, dass es unter Solaris auch zwei Versionen von Awk gibt, eine in / bin und eine in / usr / xpg4 / bin / awk (was meiner Meinung nach nawk ist).
Wenn Sie eine JJJJMMTT-Datumszeichenfolge durchgeben, wird sie in die Anzahl der Sekunden seit der Epoche konvertiert (mit ein wenig Nachgeben, damit die Tagesgrenzen eingehalten werden). Dann können Sie die beiden subtrahieren.
quelle
Leider bietet keines der POSIX-Befehlszeilendienstprogramme eine Datumsberechnung an.
date -d
unddate +%s
sind der richtige Weg, wenn Sie sie haben, aber sie sind GNU-Erweiterungen.Es gibt einen ungeschickten Hack mit
touch
solchen Arbeiten, um zu überprüfen, ob ein Datum mindestens n Tage in der Vergangenheit liegt:(Beachten Sie, dass dieser Code möglicherweise um eins deaktiviert ist, wenn die Sommerzeit in dem Intervall gestartet oder gestoppt wurde und das Skript vor 1 Uhr morgens ausgeführt wird.)
Mehrere Personen haben schließlich Datumsmanipulationsbibliotheken in der Bourne- oder POSIX-Shell implementiert. In den häufig gestellten Fragen zu comp.unix.shell finden Sie einige Beispiele und Links .
Das Installieren von GNU-Werkzeugen kann die schmerzärmste Methode sein.
quelle
Ich würde versuchen, den
date
Befehl zu verwenden, der Teil von POSIX ist, so ist es fast überall. UPDATE: Leider scheint -d nicht Teil des POSIX-Datums zu sein und wahrscheinlich auch nicht unter Solaris. Daher wird dies wahrscheinlich nicht die Frage des OP beantworten.Now
d1
undd2
sind ganze Zahlen, die Sekunden seit der Unix-Epoche entsprechen. Um den Unterschied zwischen den beiden zu erhalten, subtrahieren wir ($((d1-d2))
in Bash) und wandeln uns in die Einheiten, die wir wollen. Tage sind am einfachsten:Die Konvertierung wird wahrscheinlich anders sein, wenn Sie keine Bash haben. Die portabelste Möglichkeit ist möglicherweise die Verwendung
expr
( expr's posix man page ).quelle
Für das Protokoll ist dateutils mein Versuch, eine Reihe portabler Tools bereitzustellen , die Datumsarithmetik abdecken. Ihr Beispiel läuft auf
Das
-i
gibt das Eingabeformat an.quelle
Perl wird wahrscheinlich installiert und es ist einfach genug, Module aus dem CPAN zu holen , sie in Ihrem Home-Verzeichnis zu installieren und in Ihrem Programm darauf zu verweisen . In diesem Fall verfügt das Date :: Calc- Modul über eine
Delta_Days
Unterroutine, die Abhilfe schafft.quelle
Wrt GNU-Datum unter Solaris:
Ich sage das noch einmal:
Zu viele Solaris-SysAdmins sind stolz darauf, die offiziellen Pakete von Sun (jetzt Oracle) nicht zu installieren, die ein Solaris-System "GNU-kompatibel" machen, wenn sie einen neuen Host konfigurieren. Schlägt mich warum.
GNU Date ist exzellent und sollte standardmäßig auf jedem Solaris-Host (IMHO) verfügbar sein.
Unter Solaris 10
Installieren Sie das Paket SFWcoreu von der Solaris Companion-CD. Nach der Installation finden Sie das GNU-Datum in
/opt/sfw/bin/date
Unter Solaris 11
Möglicherweise haben Sie es bereits, da es meiner Meinung nach Teil der Standardinstallation ist. Es heißt jedoch
gdate
, um es von der Sun-Version des Datums zu unterscheiden.Tun Sie dies, wenn nicht installiert:
quelle
/usr/bin/gdate
und/usr/gnu/bin/date
Sie können wählen, ob Sie es nach Name oder nach $ PATH-Einstellung verwenden möchten.Wenn Sie Python haben:
Sie haben Ihre Frage mit "gawk" markiert, aber Sie sagen "no GNU tools". Gawk hat Datumsarithmetik.
quelle
Python:
quelle
1. Definieren Sie Datum1 und
%j
Datum2 im Format Tag des Jahres (001..366)2. Berechnen Sie die Differenz mit
expr
3. Die Antwort lautet also 32 Tage
... oder Einzeilerlösung
oder
oder
quelle
Mit Datum BSD für macOS:
quelle
Mit der awk Velour-Bibliothek können Sie die Differenz in Sekunden zurückgeben:
Oder Tage:
quelle