次の形式のレコードを含むファイルがあります。
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