
У меня есть поток информации с последовательного входа (антенны 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
Ты можешьprint
или printf
прямо в файлв пределах awk
и закрывать его после каждой записи. Это заставит awk
его открыться и обрезаться при следующей печати.
awk -vfile=test.out '{print $0 > file; close(file)}'
(Строго говоря, здесь возникает состояние гонки, другой процесс может попытаться прочитать файлтолькомежду усечением и записью, поэтому он будет казаться пустым (или, что еще хуже, но менее вероятно, частичным).)