Вы можете использовать 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
Этот цикл длится 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
.
Предполагая, что 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
Есть dateseq
(, иногда называемый dseq
илиdateutils.dseq
)из dateutils
для этого:
dateseq -{i,f}%Y%m%d 20170301 20170831
Из 3 оболочек, которые поддерживают этот for ((...))
синтаксис (ksh93
(, откуда он исходит от ), zsh
и bash
), две встроены -для поддержки этого, хотя и по-разному:
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
.