
Tengo un flujo de información desde una entrada en serie (Antena GPS) y deseo enviar esa información a un archivo de texto en cada entrada (cada segundo en este caso), pero en lugar de agregarlo al final del archivo como lo haría > después la sobrescritura inicial. Me gustaría que la sobrescribiera cada segundo para que solo se muestre la información más reciente.
Probé \r que logra el efecto en bash pero no en el archivo de salida.
cat /dev/ttyACM0 | grep --line-buffered -E "GNGGA" | awk 'BEGIN {FS=","};{printf "%s%s\t\t%s%s\t\t%s%s\t%s%s","Time= ",$2,"Lat= ",$3,"Lon= " ,$5,"Alt= " ,$10; fflush(stdout) }' > somefiles.txt
Esto incluye la entrada inicial, un grep para centrarse en una línea y awk para obtener las partes específicas de la información que necesito; hasta donde yo sé, no afectan el problema de sobrescritura.
Time= 155325.00 Lat= 7428.77433 Lon= 82845.15963 Alt= 21.5
Este es el resultado que comienza sobrescribiendo somefiles.txt pero luego se agrega hasta que se detiene y ejecuta el comando nuevamente.
Entonces, ¿hay alguna manera de hacer que solo la última entrada aparezca como una línea en el archivo de texto?
Gracias
Respuesta1
Puedeprint
o printf
directamente a un archivodentro awk
y ciérrelo después de cada escritura. Eso haría que awk
se reabriera y se truncara en la siguiente impresión.
awk -vfile=test.out '{print $0 > file; close(file)}'
(Estrictamente hablando, aquí obtienes una condición de carrera, otro proceso podría intentar leer el archivojustoentre truncar y escribir, por lo que parecería vacío (o peor, pero menos probable, parcial).)