zsh
:typeset -A seen=()
for f (*.log*(nOn)) {((seen[${f%%.*}]++)) && echo rm -f -- $f}
(удалите echo
, если результат вас устраивает.
*.log*(nOn)
перечисляет файлы *.log*
численно в обратном порядке (, где f.log
сортируется после самого f.log.0
после самого f.log.9
послеf.log.10
).
typeset -A seen=()
объявляет ассоциативный массив $seen
. Мы rm
файл, если часть перед первой.
(${f%%.*}
)была просмотрена ранее.
printf '%s\0' *.log* |
sort -rzV |
gawk -v RS='\0' -v ORS='\0' -F. 'seen[$1]++' |
xargs -r0 echo rm -f --
Но при условии, что имена файлов не содержат пробелов, кавычек или обратной косой черты:
printf '%s\n' *.log* |
sort -rt. -k1,1 -k3,3rn |
awk -F. 'seen[$1]++' |
xargs echo rm -f --
Все они предполагают, что часть имени файла до .log
не содержит точек.
Использованиеawk
:
$ cal | awk '{ gsub(/[^ ] | /, "& ") }1'
или используяsed
:
$ cal | sed -E 's/[^ ] | /& /g'
June 2021
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Это может быть то, что вы пытаетесь сделать:
$ cal | awk 'NR>1{gsub(/.../,"& ")}1'
June 2021
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Обратите внимание, что он не будет добавлять пробел в «ячейку» в конце каждой строки, а также не будет добавлять дополнительный пробел после «ячейки» в строке месяц+год.
GNU awk
cal | cat | gawk -v FIELDWIDTHS="3 3 3 3 3 3 2" 'NR > 1 {$1 = $1} 1'