Это может быть достигнуто за счет использования очень простой -машины состояний:
$ awk -v OFS="\t" '/^[A-Z][A-Z]/ && !/^BO/ { flag=0 } /^BO/ { flag=1 } flag == 1 && NF == 4 { $4 = sprintf("%.2f", 1+$4) } { print }' file
AK
v 0.00u 0.00 0.00 0.00 0.00 0.00 0.00
398.56 0.00 0.00 0.00 0.00 0.00 0.00
398.56 50.00 0.00 0.00 0.00 0.00 0.00
0.00 50.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00
BO
v 25.00o 18.75 15.00
v 75.00o 18.75 15.00
v 323.56o 18.75 15.00
v 373.56o 18.75 15.00
EN
Сценарий ничего не делает, кроме как передает ввод к выводу, пока не дойдет до строки, начинающейся с BO
, затем устанавливает flag
в 1.
Если flag
равно 1 и текущая строка содержит четыре столбца, четвертый столбец переформатируется с использованием sprintf()
и 1+$4
. Спецификация формата %.2f
означает «значение с плавающей запятой с двумя десятичными разрядами».
Если в начале строки найдено что-то отличное от BO
, flag
сбрасывается на ноль.
Заполнение между столбцами изменяется в выходных строках, где была сделана модификация. Это связано с тем, что awk
разбивает поля на пробелы, а затем объединяет их, используя OFS
(, установленный здесь как символ табуляции ), когда происходит вывод.
Чтобы получить точно такой же выходной формат, как и входной, вы можете сделать что-то вроде
$ awk -v OFS="\t" '/^[A-Z][A-Z]/ && !/^BO/ { flag=0 } /^BO/ { flag=1 } flag == 1 && NF == 4 { printf("%3s %11s%10.2f %10.2f\n", $1,$2,$3,1+$4); next } { print }' file
AK
v 0.00u 0.00 0.00 0.00 0.00 0.00 0.00
398.56 0.00 0.00 0.00 0.00 0.00 0.00
398.56 50.00 0.00 0.00 0.00 0.00 0.00
0.00 50.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00
BO
v 25.00o 18.75 15.00
v 75.00o 18.75 15.00
v 323.56o 18.75 15.00
v 373.56o 18.75 15.00
EN
Может быть что-то вроде этого:
find. -mindepth 1 -maxdepth 1 -not -empty -type d -mtime +3 -exec rm -rf {} \;
Это решение удалит непустые каталоги уровня 1, которые не редактировались touch
более трех дней.
Сделайте резервную копию ваших данных перед тестированием.
В оболочке zsh
не-пустые каталоги в /tmp
с отметкой времени модификации более трех дней назад будут соответствовать шаблону подстановки имен файлов
/tmp/*(/DNFm+3)
Квалификатор glob (/DNFm+3)
означает
/
; это не обязательно, так как квалификатор F
подразумевал бы то же самое ), D
; работает как опция оболочки dotglob
в bash
), N
; работает как опция оболочки nullglob
в bash
), F
),m+3
; для каталогов это означает, что в последний раз что-то добавлялось или удалялось из каталога много дней назад; как и для find
's -mtime +3
, это означает4 дней или старше). Чтобы просмотреть все совпадения, используйте
print -rC1 -- /tmp/*(/DNFm+3)
Для их удаления используйте
rm -rf -- /tmp/*(/DNFm+3)
Если таких совпадений несколько тысяч и вы сталкиваетесь с слишком длинным списком аргументов ошибок, используйте цикл:
for dirpath in /tmp/*(/DNFm+3); do
rm -rf -- $dirpath
done
Или используйтеzargs
:
autoload zargs
zargs -- /tmp/*(/DNFm+3) -- rm -rf
Или включите встроенную функцию rm
с zmodload zsh/files
, которая позволит обойти это ограничение системного вызова execve()
.