入力の更新ごとに出力ファイルを上書きする方法

入力の更新ごとに出力ファイルを上書きする方法

シリアル入力 (GPS アンテナ) からの情報ストリームがあり、その情報を入力ごとに (この場合は 1 秒ごとに) テキスト ファイルに出力したいのですが、最初の上書き後にファイルの末尾に追加するのではなく、1 秒ごとに上書きして最新の情報だけが表示されるようにしたいと思います。

私は \r を試しましたが、bash では効果が得られましたが、出力ファイルでは効果が得られませんでした。

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

これには、最初の入力、1 行に焦点を合わせるための grep、必要な情報の特定の部分を取得するための awk が含まれますが、私の知る限り、これらは上書きの問題には影響しません。

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

これは、somefiles.txt を上書きすることから始まり、停止してコマンドを再度実行するまで追加され続ける出力です。

では、最新の入力のみをテキスト ファイルに 1 行として表示する方法はありますか?

ありがとう

答え1

あなたはできるprintまたはprintfファイルに直接内でawk、書き込みのたびに閉じます。これにより、awk次の印刷時に再度開いて切り捨てられるようになります。

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

(厳密に言えば、ここで競合状態が発生し、別のプロセスがファイルを読み込もうとする可能性がある。ただ切り捨てと書き込みの間に空白があるように見える (または、それよりも悪いが、可能性は低いが、部分的であるように見える)。

関連情報