
Tengo una pregunta sobre las secuencias de comandos de Shell y la herramienta jq para crear un archivo json con marcas de tiempo.
echo "{\"vtg\":[$value]}" | jq -a '. + {date: now|strflocaltime("%r")}' > sample.json
Con este comando obtengo el siguiente archivo json.
{
"vtg": [
11.769,
11.769,
11.339,
11.788,
11.867,
11.886,
11.808,
11.339,
11.554,
11.182
],
"date": "03:31:52 PM"
}
Pero quiero una marca de tiempo como,
"date": [
15,
31,
52
]
cuando hacer
strptime("%H:%M:%SZ")
Se supone que debo obtener esa marca de tiempo en el formato que quiero. Pero me da error:
jq: error (at <stdin>:10): strptime/1 requires string inputs and arguments
¿Alguien puede ayudarme a obtener esa marca de tiempo en un archivo JSON?
Respuesta1
La strptime()
función se utiliza paraanalizar gramaticalmenteuna hora formateada (lo inverso de lo que strftime()
hace). Quieres strftime()
.
Usando jq
:
jq -n 'now as $t | { date: [ ($t|strftime("%H")), ($t|strftime("%M")), ($t|strftime("%S")) ] }'
Esto se utiliza strftime()
para formatear la hora dada por la now
función. Utilícelo strflocaltime()
para convertir la hora a hora local.
Si eso es demasiado prolijo o parece ineficiente (¡en realidad estamos llamando strftime()
una vez para cada elemento de la date
matriz!), entonces considere crear una HH:MM:SS
marca de tiempo.cadena, y luego dividirlo en dos puntos:
jq -n '{ date: (now | strftime("%H:%M:%S") | split(":")) }'
Cualquiera de los comandos anteriores puede producir
{
"date": [
"07",
"01",
"23"
]
}
Script completo (se utiliza jo
para crear de forma segura la matriz inicial vtg
a partir de los valores de una bash
matriz con nombre):
#!/bin/bash
value=(11.769 11.769 11.339 11.788 11.867 11.886 11.808 11.339 11.554 11.182)
jo vtg="$( jo -a "${value[@]}" )" |
jq '. += now as $t | { date: [ ($t|strftime("%H")), ($t|strftime("%M")), ($t|strftime("%S")) ] }'
# or...
jo vtg="$( jo -a "${value[@]}" )" |
jq '. += { date: (now | strftime("%H:%M:%S") | split(":")) }'
Obviamente, también puede crear la sección de fecha de los datos sobre la marcha jo
leyendo el date
comando:
jo vtg="$( jo -a "${value[@]}" )" \
date="$( jo -a $( date +'%H %M %S' ) )"
Esto depende de que el shell divida la salida de date
los espacios en la cadena de formato. Obtendrá la hora local de lo anterior.
La jo
herramienta está disponible enhttps://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/