Создание последовательности с _ в числе

Использование 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)'
-1
11.11.2019, 00:33
2 ответа

Возможно, это излишне, но мне удалось добиться этого с помощью следующей функции 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 минуту к дате, пока она не сравняется с заданной датой окончания.

Примечание.:Если заданная дата окончания окажется раньше заданной даты начала, будет запущен бесконечный цикл.

0
28.01.2020, 05:14

Для циклического перебора дат просто задайте начало и конец и выполните цикл по всем нужным временным шагам.

Просто используйте время эпохи для начала и окончания и добавляйте 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-версий не поддерживают определение формата входной строки.

-1
28.01.2020, 05:14

Теги

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