如何在每次輸入更新時覆蓋輸出文件

如何在每次輸入更新時覆蓋輸出文件

我有來自串行輸入(GPS 天線)的資訊流,並希望在每個輸入上將該資訊輸出到文字檔案中(在本例中為每秒),而不是像> 之後那樣將其附加到文件末尾初始覆蓋我希望它每秒都覆蓋它,這樣只顯示最新的資訊。

我試過 \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

這包括初始輸入、專注於一行的 grep 和獲取我需要的資訊的特定部分的 awk,據我所知,它們不會影響覆蓋問題。

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

這是首先覆蓋 somefiles.txt 的輸出,然後追加直到您停止並再次運行該命令。

那麼有沒有一種方法可以讓最新的輸入只在文字檔中顯示為一行呢?

謝謝

答案1

你可以printprintf直接到文件awk,並在每次寫入後關閉它。這將awk在下一次列印時重新打開並截斷它。

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

(嚴格來說,您在這裡遇到了競爭條件,另一個進程可能會嘗試讀取該文件只是在截斷和寫入之間,所以它看起來是空的(或更糟但不太可能是部分的)。

相關內容