如何在每次输入更新时覆盖输出文件

如何在每次输入更新时覆盖输出文件

我有来自串行输入(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)}'

(严格来说,您在这里遇到了竞争条件,另一个进程可能会尝试读取该文件只是在截断和写入之间,所以它看起来是空的(或更糟糕但不太可能是部分的)。)

相关内容