我有一个包含以下格式记录的文件:
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()
.
然后,它将生成的时间戳减少整整 7 天(以秒为单位),并YYYYMMDD
使用 将其重新格式化为日期字符串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