So überschreiben Sie die Ausgabedatei bei jeder Eingabeaktualisierung

So überschreiben Sie die Ausgabedatei bei jeder Eingabeaktualisierung

Ich habe einen Informationsstrom von einem seriellen Eingang (GPS-Antennen) und möchte diese Informationen bei jedem Eingang (in diesem Fall jede Sekunde) in eine Textdatei ausgeben. Anstatt sie jedoch an das Ende der Datei anzuhängen, wie dies nach dem ersten Überschreiben der Fall wäre, möchte ich, dass sie jede Sekunde überschrieben werden, sodass nur die neuesten Informationen angezeigt werden.

Ich habe \r ausprobiert, was den Effekt in Bash erzielt, aber nicht in der Ausgabedatei.

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

Dazu gehören die anfängliche Eingabe, ein grep zum Fokussieren auf eine Zeile und ein awk, um die spezifischen Teile der Informationen abzurufen, die ich brauche. Soweit ich weiß, haben sie keinen Einfluss auf das Überschreibproblem.

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

Dies ist die Ausgabe, die zunächst die Datei „somefiles.txt“ überschreibt, dann aber angehängt wird, bis Sie anhalten und den Befehl erneut ausführen.

Gibt es also eine Möglichkeit, nur die letzte Eingabe als eine Zeile in der Textdatei anzuzeigen?

Danke

Antwort1

Du kannstprintoder printfdirekt in eine Dateiinnerhalb awkund schließen Sie es nach jedem Schreiben. Das würde dazu führen, dass awkes beim nächsten Drucken erneut geöffnet und abgeschnitten wird.

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

(Genau genommen handelt es sich hier um einen Race Condition, ein anderer Prozess könnte versuchen, die Datei zu lesenNurzwischen dem Abschneiden und Schreiben, sodass es leer (oder schlimmer, aber weniger wahrscheinlich, teilweise) erscheint.)

verwandte Informationen