Awk 在unix中将csv文件中的ISO日期转换为DD-MON-YYYY

Awk 在unix中将csv文件中的ISO日期转换为DD-MON-YYYY,awk,sed,scripting,Awk,Sed,Scripting,我有一个csv文件,包含ISO格式的日期,如下所示 id,x1,x2,x3 AIR,Partner,2015-10-20T04:00:00.000Z,2015-10-20T04:00:00.000Z,2016-02-12T05:00:00.000Z CMX,Partner,Tier,2017-03-23T04:00:00.000Z WKA,Partner,Tier,2017-05-22T04:00:00.000Z APP,Partner,2017-10-04T04:00:00.000Z,Tier

我有一个csv文件,包含ISO格式的日期,如下所示

id,x1,x2,x3
AIR,Partner,2015-10-20T04:00:00.000Z,2015-10-20T04:00:00.000Z,2016-02-12T05:00:00.000Z
CMX,Partner,Tier,2017-03-23T04:00:00.000Z
WKA,Partner,Tier,2017-05-22T04:00:00.000Z
APP,Partner,2017-10-04T04:00:00.000Z,Tier
BUN,2017-09-27T04:00:00.000Z,Partner,,2017-09-27T04:00:00.000Z
日期没有固定列,它可以出现在除第1列以外的任何列中

我想将所有ISO日期转换为DD-MON-YYYY或DD/MM/YYYY格式


请提供帮助。

您可以通过UNIX管道使用以下各项:

sed-E的#\b([0-9]{4})-(0-9]{2})-(0-9]{2})T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z\b#3/\2/\1#g'

另一个选项是以下PCRE,它在开始处显式强制执行
分隔符(正如您提到的,此字段不能是第一个),并在匹配表达式的结尾处强制执行
或EOL:


cat|perl-pe's#,\K([0-9]{4})-(0-9]{2})([0-9]{2})T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z(?=,{124$){3/$2/$1}g'
您可以通过UNIX管道使用以下命令:

sed-E的#\b([0-9]{4})-(0-9]{2})-(0-9]{2})T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z\b#3/\2/\1#g'

另一个选项是以下PCRE,它在开始处显式强制执行
分隔符(正如您提到的,此字段不能是第一个),并在匹配表达式的结尾处强制执行
或EOL:


cat|perl-pe's#,\K([0-9]{4})-(0-9]{2})([0-9]{2})T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z(?=,{124$){3/$2/$1}
您可以将前面的答案与以下两个选项结合起来,具体取决于您喜欢的两个选项中的哪一个:


  • 第一种选择是不使用任何库,而是直接嵌入月份名称:

    cat 48941818.txt|perl-pe'@m=qw(1-2-3-4-5-6-7-8-9-10-11-12);[0-9]{2}[0-9]{2}[0-9]{2}[0-9]{2}.[0-9]{3}Z(?=,|$){3-$m[$2]-$g'


  • 第二个选项是使用as in,并使用
    e
    修饰符将替换部分视为perl代码,如所述,最终如中所述,这使得它更加灵活,因为您可以进一步改进日期格式(虽然在我的系统上,
    %v
    不起作用,
    %e
    在一位数天内有额外的空间)

    %cat48941818.txt|perl-pe'使用posixqw(strftime);s#,\K([0-9]{4})-(01][0-9])-([0-3][0-9])T([0-9]{2}):[0-9]{2}:[0-9]{2}.[0-9]{3}Z=,| POSIX:%strftime(qw/---%b/,0,0-9][2}:$1,0-3,$1,$1
    id,x1,x2,x3
    AIR,合作伙伴,2015年10月20日,2015年10月20日,2016年2月12日
    CMX,合作伙伴,第三层,2017年3月23日
    WKA,合伙人,第二层,2017年5月22日
    应用程序,合作伙伴,2017年10月4日,第三层
    BUN,2017年9月27日,合伙人,2017年9月27日
    %


根据您最喜欢的两个答案中的哪一个,您可以将前面的答案与结合起来,以获得以下两个选项:


  • 第一种选择是不使用任何库,而是直接嵌入月份名称:

    cat 48941818.txt | perl-pe'@m=qw(1-2-3-4-6-7-8-9-10-11-12);s#,\K([0-9]{4}-([01][0-9])-([0-3][0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z=,[0-9]{3-$m[$2][1}code>


  • 第二个选项是使用as in,并使用
    e
    修饰符将替换部分视为perl代码,如所述,最终如中所述,这使得它更加灵活,因为您可以进一步改进日期格式(虽然在我的系统上,
    %v
    不起作用,
    %e
    在一位数天内有额外的空间)

    %cat48941818.txt|perl-pe'使用posixqw(strftime);s#,\K([0-9]{4})-(01][0-9])-([0-3][0-9])T([0-9]{2}):[0-9]{2}:[0-9]{2}.[0-9]{3}Z=,| POSIX:%strftime(qw/---%b/,0,0-9][2}:$1,0-3,$1,$1
    id,x1,x2,x3
    AIR,合作伙伴,2015年10月20日,2015年10月20日,2016年2月12日
    CMX,合作伙伴,第三层,2017年3月23日
    WKA,合伙人,第二层,2017年5月22日
    应用程序,合作伙伴,2017年10月4日,第三层
    BUN,2017年9月27日,合伙人,2017年9月27日
    %

请参阅,然后重试。请参阅,然后重试。