2017-01-17 22 views
0

文字列、開始日、終了日を受け入れ、以下の形式の出力ファイルを生成するシェルスクリプトファイルを作成する必要があります。AIXのシェルスクリプトの日付を増やす

注:日付が、私は日付をインクリメントすることはできませんよMM/DD/YYYY

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

です。 date -dオプションを使用してみましたが、AIXでは使用できません。

誰かがシェルスクリプトコマンドやperlコマンドを組み込み、日付を増やすことができますか? 'コアを使用しています' の制約を考えると

+0

サードパーティ製のPerlモジュールをインストールできますか、または組み込み機能を使用する必要がありますか?後者の場合は、Perlのどのバージョンがありますか? –

+4

... as: 'MM/DD/YYYY'はおそらく最も広く使用されている日付形式です(' MON/DD/YYYY '以外のものはおそらく、 YY'):ASCIIソートはそれをひどく扱いますが、しばしばあいまいです(DD/MM/YYYYを使用しているかどうかはよく分かりません)。あなたが制御権を持っているとき、 'YYYY-MM-DD'は正しいことです。それは人間の読者にとってあまりあいまいではなく、RFCに準拠しています。 –

+1

「MM/DD/YYYY」はおそらく最も広く使用されている日付形式です。「それは意味をなさないとは言えません。 – 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::PieceTime::Secondsは、Perl 5.9.5のようなコアです。後者はONE_DAYにのみ必要です。そうでない場合は、代わりに60 * 60 * 24を追加してください。

自分で文字列などを印刷する方法を理解できると確信しています。

(私も注意したい - これは恐ろしい時間フォーマットであり、should be avoided

+0

ISO 8601のリンクが大好きです。 –

0

あなたはこのような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が何かを追加していませんしかし、入力値やスクリプトのメンテナンスに間違いがある場合は、 の間違いに対して助けになります。

関連する問題