Bash

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

  • April 6, 2017

我有一個來自串列輸入(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 開始的輸出,但隨後會追加,直到您停止並再次執行該命令。

那麼有沒有辦法讓最新的輸入在文本文件中顯示為一行?

謝謝

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

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

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

引用自:https://unix.stackexchange.com/questions/356396