通过 shell 脚本将 .csv 文件中的日期修改为 -7 天

通过 shell 脚本将 .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().

然后,它将生成的时间戳减少整整 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

相关内容