シェルスクリプトを介して.csvファイルの日付を-7日に変更します。

シェルスクリプトを介して.csvファイルの日付を-7日に変更します。

次の形式のレコードを含むファイルがあります。

D20200826,S2927,977,1

予想出力:

D20200819,S2927,977,1

今私が達成したいのは、何とか日付(最初の列)を過去7日に移動できることです。つまり、現在の日付が29日の場合22日になるようにしたいのです。

答え1

awk時間関連関数mktime()strftime()mawkまたはGNU awk)があると仮定すると、awkスクリプトは

BEGIN {
        OFS = FS = ","
}

{
        t = mktime(sprintf("%4d %.2d %.2d 00 00 00",
                substr($1,2,4),
                substr($1,6,2),
                substr($1,8,2)));

        $1 = substr($1,1,1) strftime("%Y%m%d", t - 7*24*60*60)

        print
}

複数の呼び出しを使用して、最初のカンマで区切られた列の日付仕様を分析し、substr()を使用しますmktime()

YYYYMMDD次に、結果のタイムスタンプを7日(秒単位)減らしますstrftime()。結果の日付文字列は、変更された行全体を印刷する前に、最初の列Dデータの最初の文字(例ではa)で最初の列に割り当てられます。

一部のデータに対して上記のスクリプトをテストします。

$ cat file
D20200826,S2927,977,1
D20200106,S2927,977,1
$ awk -f script.awk file
D20200819,S2927,977,1
D20191230,S2927,977,1

やや短いバリエーション:

BEGIN { OFS = FS = "," }

{
        $1 = substr($1,1,1) strftime("%Y%m%d",
                mktime(sprintf("%4d %.2d %.2d 00 00 00",
                        substr($1,2,4),
                        substr($1,6,2),
                        substr($1,8,2))) - 7*24*60*60)
}

1

そして「一行」で:

awk -F, '{ $1 = substr($1,1,1) strftime("%Y%m%d",mktime(sprintf("%4d %.2d %.2d 00 00 00",substr($1,2,4),substr($1,6,2),substr($1,8,2)))-7*24*60*60) }; 1' OFS="," file

答え2

ぼんやりしているだけ

awk -F, '{$1 = strftime("D%Y%m%d",\
mktime(gensub(/.(.{4})(.{2})(.{2})/, "\\1 \\2 \\3 0 0 0", 1, $1))-7*3600*24)}1' OFS=, file

関連情報