Как запустить цикл for через 5 месяцев?

Вы можете использовать awk для добавления номера строки (NR) к каждой строке с:

awk '{print $0 NR}' file

Если вы хотите вывести остаток, когда номер строки делится на 10:

awk '{print $0 NR%10}' file

Это печатает то, что вы хотите, за исключением того, что печатает 0 вместо 10. Если вам нужно 10, вы можете вычислить (NR - 1)%10 + 1:

awk '{print $0 (NR - 1)%10 + 1}' file

Результат:

vol123,12/05/2016,ABC1
vol123,12/05/2016,ABC2
vol123,12/05/2016,ABC3
vol123,14/05/2016,ABC4
vol123,13/05/2016,ABC5
vol123,12/05/2016,ABC6
vol123,12/05/2016,ABC7
vol123,18/05/2016,ABC8
vol123,12/05/2016,ABC9
vol123,12/05/2016,ABC10
vol123,12/05/2016,ABC1
vol123,12/05/2016,ABC2
vol123,19/05/2016,ABC3
vol123,12/05/2016,ABC4
vol123,12/05/2016,ABC5
vol123,20/05/2016,ABC6
vol123,12/05/2016,ABC7
vol123,12/05/2016,ABC8
vol123,22/05/2016,ABC9
vol123,12/05/2016,ABC10
vol123,12/05/2016,ABC1
3
15.09.2017, 12:49
3 ответа

Этот цикл длится 5 *30 дней, начиная с 20170301:

for (( i=0; i <= 150; ++i )); do
    thedate=$( date -d "20170301 + $i days" "+%Y%m%d" )
    printf 'The date is "%s"\n' "$thedate"
done

Это не приведет нас к 20170831, так что...

Это действие начинается с одной даты, пока не будет достигнута определенная дата окончания:

startdate='20170301'
thedate=$startdate

for (( i=0; thedate != 20170831; ++i )); do
    thedate=$( date -d "$startdate + $i days" "+%Y%m%d" )
    printf 'The date is "%s"\n' "$thedate"
done

Здесь используется начальная дата и вычисляется конечная дата через 5 месяцев от этой даты, а затем зацикливается:

startdate='20170301'
enddate=$( date -d "$startdate + 5 months" "+%Y%m%d" )

thedate=$startdate

for (( i=0; thedate != enddate; ++i )); do
    thedate=$( date -d "$startdate + $i days" "+%Y%m%d" )
    printf 'The date is "%s"\n' "$thedate"
done

Это предполагает GNU dateи оболочку типа bash, ksh93или zsh.

2
27.01.2020, 21:15

Предполагая, что GNU dateдоступен, вы можете использовать этот скрипт bash/ ksh93/ zsh:

start=$(date -ud 20170301 "+%s") # start time in epoch time (seconds since Jan. 1st, 1970)
end=$(date -ud 20170831 "+%s") # end time 

for ((i=start; i <= end; i+=86400)); do # 86400 is 24 hours
    runCerclient-layer-name "$(date -ud "@$i" +%Y%m%d)"
done
3
27.01.2020, 21:15

Есть dateseq(, иногда называемый dseqилиdateutils.dseq)из dateutilsдля этого:

dateseq -{i,f}%Y%m%d 20170301 20170831

Из 3 оболочек, которые поддерживают этот for ((...))синтаксис (ksh93(, откуда он исходит от ), zshи bash), две встроены -для поддержки этого, хотя и по-разному:

кш93

for ((i = 20170301; i<=20170831; i=$(TZ=UTC0 printf '%(%Y%m%d)T' "$i 24:00")))
do
   echo "$i"
done

зш

zmodload zsh/datetime
for ((i = 20170301; i<=20170831;)); do
  echo "$i"
  TZ=UTC0 strftime -rs s %Y%m%d $i
  TZ=UTC0 strftime  -s i %Y%m%d $((s + 86400))
done

баш

Оболочка GNU printfтакже поддерживает ksh93-, как и %T, но только для форматирования, а не для анализа дат. Однако там, где доступен bash, часто доступен GNU date, и для этого было дано несколько ответов.

Другие dateреализации, такие как busybox или BSD, также имеют эту возможность, но с другим синтаксисом.

Другие альтернативы включают GNU awkили perl.

0
27.01.2020, 21:15

Теги

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