El más corto con GNUdatamash
:
datamash -sW -g1 max 2 <file
-s
-ordenar la entrada antes de agrupar -W
-use espacios en blanco (uno o más espacios y/o tabuladores )para delimitadores de campo -g 1
-grupo a través del primer campo max 2
-operación numérica para obtener el valor máximo del 2do campo por grupo La salida:
host1 222
host2 90
host3 8
я только что перечислил, что вы замените команду ls согласно вашему требованию
ls -ltr | awk '$1 ~ /^d/{print $0}'|sed -n '/[0-9]\{6\}/p'| awk '$NF >= "201412" {print "ls -ltr "$NF}'| sh
Текущее требование состоит в том, чтобы перечислить имена подкаталогов, которые являются после 201412
, т. е. 201501
или более поздней версии.
Эти каталоги будут соответствовать шаблону 201[5-9]*
.
Чтобы также обрабатывать имена после 2019 (до 2099 ), используйте 201[5-9]* 20[2-9]*
.
Перечислить их:
shopt -s nullglob # to allow non-matching globs to expand to nothing
printf '%s\n' somedir/201[5-9]*/ somedir/20[2-9]*/
где somedir
— это каталог, в котором хранятся ваши подкаталоги.
Что-то сделать с каждым из них:
shopt -s nullglob
for dir in somedir/201[5-9]*/ somedir/20[2-9]*/; do
aws s3 cp "$dir"...
done
Примечание. :Я никогда не использовал S3, поэтому не знаю, какую команду использовать для загрузки каталога файлов.
Я бы использовал вариацию теперь -удаленного ответа для создания массива нужных файлов в bash:
$ mkdir 201412 201501 201705 202003
$ files=()
$ for d in */
do
(( d > 201412)) && files+=("$d")
done
$ declare -p files
declare -a files='([0]="201501" [1]="201705" [2]="202003")'
Затем вы можете безопасно перебрать этот массив (или развернуть его целиком )для загрузки, например:
$ aws upload command "${files[@]}"
вывести содержимое каталога, передать вывод в awk, распечатать только те значения, значения которых больше или равны нужной дате, передать в xargs s3.
ls | awk '$1 >= 201412 {print $1}' | xargs -n1 YOUR_S3_COPY_COMMAND -options
Если каталогов и файлов много, можно распараллелить xargs с -P числом параллельных процессов.
ls | awk '$1 >= 201412 {print $1}' | xargs -n1 -P20 YOUR_S3_COPY_COMMAND -options
Я не уверен, что вы можете сделать это напрямую, поэтому вам нужно получить список каталогов, а затем отфильтровать вывод. Такая команда может помочь:
ls|awk -v snumber=201412 '$1>snumber {print}'
Попробуйте это,
find. -type d -regex '^./[0-9]+' -exec sh -c 'test "{}" ">" "./201412"' \; -print
Как я спросил в комментариях. В текущем каталоге могут быть файлы с числовыми именами -и без них
.type -d
будут перечислены только каталоги -regex '^./[0-9]+'
будут перечислены только имена с цифрами test
используется для сравнения результата Здесь вы можете добавить maxdepth
, чтобы ограничить поиск текущим каталогом, но наш regex
сам сделает то же самое.