¿Cómo obtener un sello en el script de Shell en un archivo JSON usando la herramienta jq?

¿Cómo obtener un sello en el script de Shell en un archivo JSON usando la herramienta jq?

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 nowfunció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 datematriz!), entonces considere crear una HH:MM:SSmarca 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 jopara crear de forma segura la matriz inicial vtga partir de los valores de una bashmatriz 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 joleyendo el datecomando:

jo vtg="$(  jo -a "${value[@]}" )" \
   date="$( jo -a $( date +'%H %M %S' ) )"

Esto depende de que el shell divida la salida de datelos espacios en la cadena de formato. Obtendrá la hora local de lo anterior.

La joherramienta está disponible enhttps://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/

información relacionada