2017-01-17 10 views
0

Мне нужно создать файл сценария оболочки, который принимает строку, дату начала и дату окончания и генерирует выходной файл в следующем формате.Дата добавления в сценарии оболочки в AIX

Примечание: Даты в формате ММ/ДД/ГГГГ

string,start date 
string,start date + 1 
... 
string,end date 

Я не в состоянии увеличивать дату. Я попытался использовать опцию date -d, но она недоступна в AIX.

Может кто-то может помочь с помощью встроенной команды сценария оболочки или команды perl для увеличения даты?.

+0

Можете ли вы установить сторонние модули perl, или вам нужно придерживаться встроенных функций? Если последнее, какая именно версия Perl у вас есть? (Кроме того, у вас есть интерпретатор Python? Если так, опять же, какая именно версия?) –

+4

... в стороне: 'MM/DD/YYYY' - это, пожалуй, наихудший широко используемый формат даты (кроме' MON/DD/YY'): Сортировка ASCII плохо относится к ней, и она часто неоднозначна (часто не удается определить, пользуетесь ли вы «DD/MM/YYYY», который также популярен). Когда у вас есть контроль, «YYYY-MM-DD» - это правильная вещь: он гораздо менее двусмыслен для читателей, он совместим с RFC, и он хорошо сортируется. –

+1

«ММ/ДД/ГГГГ» - это, пожалуй, наихудший широко используемый формат даты. Не говоря уже о том, что это даже не имеет смысла. – ThisSuitIsBlackNot

ответ

2

Учитывая ограничение на 'использует ядро':

#!/usr/bin/env perl 

use strict; 
use warnings; 
use Time::Piece; 
use Time::Seconds; 

my $FORMAT = '%m/%d/%Y'; 

my $start = '01/22/2016'; 
my $end = '01/31/2016'; 

my $start_t = Time::Piece->strptime($start, $FORMAT); 
my $end_t = Time::Piece->strptime($end, $FORMAT); 

while ($start_t <= $end_t) { 
    print $start_t ->strftime($FORMAT), "\n"; 
    $start_t += ONE_DAY; 
} 

Оба Time::Piece и Time::Seconds являются ядром от Perl 5.9.5. Последний нужен только для ONE_DAY - в противном случае вы можете просто добавить 60 * 60 * 24.

Я уверен, что вы можете выяснить, как печатать строки и т. Д. Самостоятельно.

(я бы также отметить, - это ужасный формат времени, и should be avoided)

+0

Любите ссылку ISO 8601 - как верно! –

0

Вы можете сделать shellscript используя AWK следующим образом:

str="some string" 
startd="12/25/2016" 
endd="1/17/2017" 

maxloop=10 

echo "${maxloop}" | 
awk -v string="${str}" -v startdate="${startd}" -v enddate="${endd}" '{ 
    split(startdate,A,"[/]"); 
    T1=mktime(A[3] " " A[1] " " A[2] " 0 0 0"); 
    split(enddate,B,"[/]"); 
    T2=mktime(B[3] " " B[1] " " B[2] " 23 59 59"); 
    linenr=1; 
    while (T1 < T2) { 
     printf("%s,%s\n",string, 
      strftime("%m-%d-%Y",T1)); 
     T1+=3600*24; 
     if (linenr++ > $1) break; 
    } 
}' 

linenr/maxloop не добавляя что-то к решению, но будет способствовать ошибкам во входных значениях или поддержанию сценария.