Перезаписать файл, только если данные

Вы можете использовать, например, awk для захвата заголовков в первой строке и повторять их каждые 10 строк, а также уменьшить размер столбца, скажем, до 5 символов с чем-то вроде этого:

tail -n +1 -f file.csv |
awk  'NR==1 { n=split($0,hdr) }
NR%10==1    { for(i=1;i<=n;i++)printf "%5.5s ",hdr[i];printf "\n" }
            { for(i=1;i<=n;i++)printf "%5.5s ",$i;printf "\n" }
'

Это даст что-то вроде

yAcce zAcce xGyro...
    3   256     1...
    4   255     3... 
    4   255    -6...
    3   253    -1...
    4   254     2...
    5   255     0...
    4   255     3...
    5   254     3...
    5   253    -1...
    4   255     3...
yAcce zAcce xGyro...
    3   256     1...
...

Если ширина все еще слишком широка для вашего терминала, вы можете передать результат в less -S +F, что сделает его похожим на tail -f, но позволит вам прокручивать влево и вправо с помощью стрелок, если вы приостановите хвост с помощью Control -C. Чтобы продолжить, введите F.

8
20.08.2019, 18:06
2 ответа

Ваш первый подход работает, вам просто нужно дать командуifne(см.man ifne):

NAME
       ifne - Run command if the standard input is not empty

SYNOPSIS
       ifne [-n] command

DESCRIPTION
       ifne  runs  the  following command if and only if the standard input is
       not empty.

Значит, нужно дать ему команду запуститься. Ты почти у цели, teeсработает:

command | ifne tee myfile > /dev/null

Если ваша команда не производит огромное количество данных, если они достаточно малы, чтобы поместиться в переменную,вы также можете сделать:

var=$(mycommand)
[[ -n $var ]] && printf '%s\n' "$var" > myfile
18
27.01.2020, 20:08

Решение для пешеходов:

tmpfile=$(mktemp)

mycommand >"$tmpfile"
if [ -s "$tmpfile" ]; then
    cat "$tmpfile" >myfile
fi

rm -f "$tmpfile"

То есть сохранить вывод во временный файл, а затем проверить, пустой он или нет. Если он не пуст, скопируйте его содержимое поверх вашего файла. В конце удалите временный файл.

Я использую cat "$tmpfile" >myfile, а неcp "$tmpfile" myfile(или mv), чтобы получить тот же эффект, который вы получили бы от mycommand >myfile, т. е. чтобы обрезать существующий файл и сохранить права собственности и разрешения.

Если $TMPDIR(, используемый mktemp), находится в смонтированной в памяти -файловой системе, то это не будет производить запись на диск, за исключением, возможно, записи в myfile. Кроме того, это было бы более портативно, чем использование ifne.

8
27.01.2020, 20:08

Теги

Похожие вопросы