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

时间:2018-02-23 05:42:25

标签: 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
BUN,2017-09-27T04:00:00.000Z,Partner,,2017-09-27T04:00:00.000Z

除了第1列之外,没有任何固定列可以显示在任何列中。

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

请帮忙。

2 个答案:

答案 0 :(得分:2)

您可以通过UNIX管道使用以下内容:

sed -E 's#\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(?=,|$)#$3/$2/$1#g'

答案 1 :(得分:0)

您可以将之前的答案与How to Print Spelled out month names rather than numbers结合使用,以获得以下两个选项,具体取决于您最喜欢的两个答案中的哪一个:

  • 第一个选项是不使用任何库,只是使用直接嵌入月份名称:

    cat 48941818.txt | perl -pe '@m = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); 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(?=,|$)#$3-$m[$2]-$1#g'

相关问题