¿Hay alguna herramienta en Solaris UNIX (por lo que no hay una herramienta GNU disponible) para restar fechas? Sé que en Linux tenemos gawk
que puede restar una fecha de otra. Pero en Solaris, el máximo que tenemos es nawk
(mejorado awk
) que no puede realizar cálculos de fechas. Además no puedo usar perl.
¿Hay alguna manera de hacer cálculos de fechas como 20100909 - 20001010
?
ACTUALIZACIÓN: ¿ bc
Puede realizar cálculos de fechas?
Respuestas:
Aquí hay un script awk que acabo de escribir, debería funcionar con un POSIX awk. Tendrá que probar la versión de Solaris; recuerde que también hay dos versiones de Awk en Solaris, una en / bin y otra en / usr / xpg4 / bin / awk (que creo que es nawk).
Pase una cadena de fecha AAAAMMdd y se convertirá a la cantidad de segundos desde la Época (con un poco de donación por estar en los límites del día). Entonces podrás restar los dos.
fuente
Desafortunadamente, ninguna de las utilidades de línea de comando POSIX proporciona aritmética en fechas.
date -d
ydate +%s
son el camino a seguir si los tiene, pero son extensiones GNU.Hay un truco torpe con
touch
ese tipo de trabajos para verificar que una fecha tenga al menos n días en el pasado:(Tenga en cuenta que este código puede estar desactivado por uno si el horario de verano se inició o se detuvo en el intervalo y el script se ejecuta antes de la 1 a.m.)
Varias personas terminaron implementando bibliotecas de manipulación de fechas en Bourne o en el shell POSIX. Hay algunos ejemplos y enlaces en las preguntas frecuentes de comp.unix.shell .
Instalar herramientas GNU puede ser la forma de menos dolor.
fuente
Intentaría usar el
date
comando que es parte de POSIX, por lo que está casi en todas partes. ACTUALIZACIÓN: Desafortunadamente, parece que -d no es parte de la fecha POSIX y probablemente no esté en Solaris. Por lo tanto, esto probablemente no responderá a la pregunta de los OP.Ahora
d1
yd2
son enteros que corresponden a segundos desde la época de Unix. Por lo tanto, para obtener la diferencia entre los dos, restamos ($((d1-d2))
en bash) y ocultamos las unidades que queramos. Los días son los más fáciles:La forma de hacer la conversión probablemente será diferente si no tienes bash. La forma más portátil puede ser usar
expr
( página de manual posix de expr ).fuente
Para el registro, dateutils es mi intento de proporcionar un conjunto de herramientas portátiles que cubran la aritmética de fechas. Tu ejemplo se reduce a
El
-i
especifica el formato de entrada.fuente
Perl es probable que se instala, y es bastante fácil de agarrar módulos de CPAN , instalarlos en su directorio personal, y se refieren a ellos en su programa. En este caso, el módulo Date :: Calc tiene una
Delta_Days
subrutina que ayudará.fuente
Fecha Wrt GNU en Solaris:
Digo esto otra vez:
Demasiados administradores de sistemas Solaris se enorgullecen de no instalar deliberadamente los paquetes oficiales de Sun (ahora Oracle) que hacen que un sistema Solaris sea "compatible con GNU" cuando configuran un nuevo host. Me gana por qué.
GNU Date es excelente y debería estar disponible de forma predeterminada en cualquier host Solaris, en mi humilde opinión.
En Solaris 10
Instale el paquete SFWcoreu desde el CD Solaris Companion. Después de la instalación, encontrará la fecha GNU en
/opt/sfw/bin/date
En Solaris 11
Es posible que ya lo tenga, ya que creo que es parte de la instalación estándar. Sin embargo, se llama
gdate
para distinguirlo de la versión de fecha de Sun.Haga esto si no está instalado:
fuente
/usr/bin/gdate
y/usr/gnu/bin/date
por lo que puede optar por utilizar ya sea por su nombre o por ajuste de $ PATH.Si tienes Python:
Etiquetó su pregunta "gawk" pero dice "no hay herramientas GNU". Gawk tiene fecha aritmética.
fuente
pitón:
fuente
1. Defina fecha1 y fecha2 en formato de
%j
día del año (001..366)2. Calcule la diferencia con
expr
3. Entonces, la respuesta es 32 días
... o solución de una sola línea
o
o
fuente
Con fecha BSD para macOS:
fuente
Puede utilizar la biblioteca awk Velour para devolver la diferencia en segundos:
O días:
fuente