Mientras intentabaConvertir fecha en bash shell, Lo intentéFunción de coproceso de GNU awk:
gawk -F, -v cmd='date +"%Y-%m-%d %H:%M:%S" -f-' '{print $5 |& cmd; cmd |& getline d; $5 = d}1' foo
Este comando se bloquea. Pensé que esto podría deberse a que date
está esperando leer la entrada completa, así que intenté cerrar la mitad de envío de la canalización:
gawk -F, -v cmd='date +"%Y-%m-%d %H:%M:%S" -f-' '{print $5 |& cmd; close(cmd, "to"); cmd |& getline d; $5 = d}1' foo
Esto funciona (sí, sé que debería configurarlo OFS=,
, pero por ahora...).
Sin embargo, date
parece no tener problemas para procesar la entrada a medida que llega. Esto proporciona la primera línea de salida inmediatamente:
d='Thu Apr 27 2017 23:19:47 GMT+0700 (ICT)'
(echo "$d"; sleep 1m; echo "$d") |
date +"%Y-%m-%d %H:%M:%S" -f-
¿Qué está sucediendo?
Respuesta1
Como muchos otros programas, date
la salida de 's se almacena en un buffer cuando la salida estándar no es un tty. Al invocarlo, stdbuf -oL
obtendrá una salida vacía en cada línea, y su primer código de muestra de Gawk simplemente funcionará (no es necesario cerrar el extremo de escritura de la tubería).