Como sobrescrever o arquivo de saída em cada atualização de entrada

0

Eu tenho um fluxo de informações de uma entrada serial (GPS Antennae) e desejo a saída dessa informação em um arquivo de texto em cada entrada (a cada segundo, neste caso), mas em vez de anexá-lo ao final do arquivo como & gt ; faria após a sobregravação inicial eu gostaria que ele sobrescrevesse a cada segundo para que apenas as informações mais recentes fossem exibidas.

Eu tentei 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 o awk para obter as partes específicas das informações que eu preciso, elas não afetam o problema de sobrescrever até onde eu sei.

Time= 155325.00     Lat= 7428.77433     Lon= 82845.15963    Alt= 21.5

Esta é a saída que começa sobrescrevendo o arquivo somefiles.txt, mas depois é anexado até que você pare e execute 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

    
por pingualoty 06.04.2017 / 18:17

1 resposta

1

Você pode print ou printf direto para um arquivo em awk e fechá-lo após cada gravação. Isso tornaria awk reabrir e truncá-lo na próxima impressão.

awk -vfile=test.out '{print $0 > file; close(file)}'

(Estritamente falando, você tem uma condição de corrida aqui, outro processo pode tentar ler o arquivo apenas entre o truncate e escrever, então parece vazio (ou pior, mas menos provável, parcial). )

    
por 06.04.2017 / 18:25