Использование perl
дает очевидную версию; разделить данные, отсортировать их, снова объединить.
Разделитель должен быть указан дважды (один раз в split
и один раз вjoin
)
например, для,
perl -lpi -e '$_=join(",",sort {$a <=> $b} split(/,/))'
Так
echo 1,100,330,42 | perl -lpi -e '$_=join(",",sort {$a <=> $b} split(/,/))'
1,42,100,330
Так как split
является регулярным выражением, символ может потребоваться заключить в кавычки:
echo 10.1.200.42 | perl -lpi -e '$_=join(".",sort {$a <=> $b} split(/\./))'
1.10.42.200
С помощью параметров -a
и -F
можно удалить разделение. С циклом -p
, как и раньше, и установите результаты на $_
, которые будут автоматически печатать:
perl -F'/\./' -aple '$_=join(".", sort {$a <=> $b} @F)'
Возможно, это излишне, но мне удалось добиться этого с помощью следующей функции bash и даты GNU (1):
seq_dates () {
local Y1 M1 D1 d1
local r
local m=0
Y1=${1:0:4}
M1=${1:4:2}
D1=${1:6:2}
d1="${Y1}-${M1}-${D1} ${1: -4}"
until [[ $r == $2 ]]; do
r=$($date -d "$d1 + $m minutes" '+%Y%m%d_%H%M')
printf '%s\n' "$r"
((m++))
done
}
Вы бы назвали это как:
seq_dates 20191110_2330 20191111_0200
Он преобразует введенную дату начала в формат, используемый датой GNU, а затем запускает цикл, каждый раз добавляя 1 минуту к дате, пока она не сравняется с заданной датой окончания.
Примечание.:Если заданная дата окончания окажется раньше заданной даты начала, будет запущен бесконечный цикл.
Для циклического перебора дат просто задайте начало и конец и выполните цикл по всем нужным временным шагам.
Просто используйте время эпохи для начала и окончания и добавляйте 60 секунд или желаемый размер шага на каждой итерации. Затем установите желаемый формат вывода.
#!/bin/bash
start=$(date -d2019-11-10T23:30 +%s)
end=$(date -d2019-11-11T02:00 +%s)
ddate="$start"
while [ $ddate -le $end ] ; do
date -d@"$ddate" +%Y%m%d_%H%M
ddate=$((ddate+60))
done
Если вы хотите преобразовать строки даты в читаемый формат для команды date
, просто используйтеsed
:
echo 20191110_2030 | sed 's/\(....\)\(..\)\(..\)_\(..\)\(..\)/\1-\2-\3T\4:\5/'
К сожалению, большинствоdate
-версий не поддерживают определение формата входной строки.