
Eu tenho um fluxo de informações de uma entrada serial (antenas GPS) e desejo gerar essas informações em um arquivo de texto em cada entrada (a cada segundo neste caso), mas em vez de anexá-las ao final do arquivo como > faria depois a substituição inicial, gostaria que ela fosse substituída a cada segundo, para que apenas as informações mais recentes sejam exibidas.
Eu tentei \r que atinge o efeito no bash, mas não no arquivo de saída.
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
Isso inclui a entrada inicial, um grep para focar em uma linha e um awk para obter as partes específicas das informações que preciso; elas não afetam o problema de substituição, até onde eu sei.
Time= 155325.00 Lat= 7428.77433 Lon= 82845.15963 Alt= 21.5
Esta é a saída que começa substituindo somefiles.txt, mas depois é anexa até você parar e executar o comando novamente.
Então, existe uma maneira de fazer com que apenas a entrada mais recente apareça como uma linha no arquivo de texto?
Obrigado
Responder1
Você podeprint
ou printf
direto para um arquivodentro awk
e feche-o após cada gravação. Isso faria awk
reabrir e truncá-lo na próxima impressão.
awk -vfile=test.out '{print $0 > file; close(file)}'
(Estritamente falando, você obtém uma condição de corrida aqui, outro processo pode tentar ler o arquivoapenasentre truncar e escrever, então pareceria vazio (ou pior, mas menos provável, parcial).)