将文本文件列字段数据 dd.mm.yy 转换为 dd.mm.YYYY

将文本文件列字段数据 dd.mm.yy 转换为 dd.mm.YYYY

如何使用 Linux 命令行工具格式化文件内容的日期?

输入:
aaa;1.70;ccc;20.01.13;zz;2013;
uuu;2.70;lll;17.12.10;zz;2013;
fff;3.70;nnn;31.01.98;zz;2013;
auu;8.70;nuu;30.02.96;zz;2013;

输出:
aaa;1.70;ccc;20.01.2013;zz;2013;
uuu;2.70;lll;17.12.2010;zz;2013;
fff;3.70;nnn;31;01.1998;zz;2013;
auu;8.70;nuu;30.02.1996;zz;2013;

答案1

假设 70 至 99 之间的任何两位数年份都是上个世纪的:

sed 's/[7-9][0-9];$/19&/; s/[0-6][0-9];$/20&/' file

或者,让别人决定:

perl -MTime::Piece -F';' -ane '
    $F[-2] = Time::Piece->strptime($F[-2], "%d.%m.%y")->strftime("%d.%m.%Y");
    print join(";", @F)
' file

选项

  • -MTime::Piece导入标准 Perl时间::件模块
  • -F';' -a选项用分号分隔每行并将结果存储在@F数组中
  • -n循环输入数据(标准输入或文件)中的行,而不自动打印每一行。

代码

  • $F[-2]是个倒数第二字段(即您原始问题中的日期所在位置)。
  • 我使用strptimestrftime方法来解析和格式化日期。

因此,如果您有需要更改第 12 至 15 列中的日期,请使用

perl -MTime::Piece -F';' -ane '
    sub reformat {
        return Time::Piece->strptime(shift, "%d.%m.%y")->strftime("%d.%m.%Y");
    }
    for my $i (11..14) {
        $F[$i] = reformat $F[$i];
    }
    print join(";", @F)
' file

答案2

可以这样做awk

   awk -F'[;.]' '{if ($6 <= 13) x=20$6; else x = 19$6 ; print \
                  $1";"$2";"$3";"$4"."$5"."x";"}' 

此命令使用分隔符;和来分隔字段.。然后,它以这种方式修改最后一个字段:如果它小于或等于 13,则将其转换为20last_field,否则将其转换为19last_filed,然后它以与以前相同的顺序使用相同的分隔符打印字段,包括修改后的第六个字段(现在称为x)。

答案3

使用dconv日期工具

dconv -Si '%d.%m.%y' -f '%d.%m.%Y' <<EOF
aaa;1.70;ccc;20.01.13;zz;2013;
uuu;2.70;lll;17.12.10;zz;2013;
fff;3.70;nnn;31.01.98;zz;2013;
auu;8.70;nuu;30.02.96;zz;2013;
EOF

产生您想要的输出。

相关内容