使用sed或awk转换日期格式

时间:2018-12-26 17:29:54

标签: date unix awk sed format

我是unix的新手,我正在寻找以下问题的答案。

我有一个半冒号分隔的文件,如下所示

Frank;01012019;01012020;woodcrest wack st
Mark;01012019;01012020;Annunciation st
Fred;01022019;01012020;Baker st

输入文件中的日期格式为DDMMYYYY格式。我需要将日期转换为YYYYMMDD格式,如下所示。

预期输出:

Frank;20190101;20200101;woodcrest wack st
Mark;20190101;20200101;Annunciation st
Fred;20190201;20200101;Baker st

请建议我使用sed或awk命令回答。

5 个答案:

答案 0 :(得分:2)

使用GNU sed:

sed -r 's/;([0-9]{2})([0-9]{2})([0-9]{4})/;\3\2\1/g' file.csv

输出:

Frank;20190101;20200101;woodcrest wack st
Mark;20190101;20200101;Annunciation st
Fred;20190201;20200101;Baker st

答案 1 :(得分:1)

awk -F';' '{print $1";"substr($2, 5, 4)""substr($2, 1, 2)""substr($2, 0, 2)";"substr($3, 5, 4)""substr($3, 1, 2)""substr($3, 0, 2)";"$4}' file

答案 2 :(得分:1)

sed -E 's/([0-9]{2})([0-9]{2})([0-9]{4});/\3\2\1;/g' data
#=> Frank;20190101;20200101;woodcrest wack st
#=> Mark;20190101;20200101;Annunciation st
#=> Fred;20190201;20200101;Baker st

\1\2\3代表每个括号捕获的内容,即此处的DDMMYYYYs将替换为sed
最后的g意味着要替换所有出现的事件,没有sed只会替换第一组。

如果输入像您说的那样经过格式化且稳定,那么sed实际上更容易实现。
ps:-E用于extended regular expressions,它在unix sed和GNU sed上都可以使用。
它使您无需逃脱(){}

答案 3 :(得分:0)

使用sed

sed -E -n 's/(.*);([0-9]{2})([0-9]{2})([0-9]{4});([0-9]{2})([0-9]{2})([0-9]{4});(.*)/\1;\4\3\2;\7\6\5;\8/p' file_name

答案 4 :(得分:0)

使用Perl

$ cat sadhiya.txt
Frank;01012019;01012020;woodcrest wack st
Mark;01012019;01012020;Annunciation st
Fred;01022019;01012020;Baker st

$ perl -F";" -lane ' s/(.{2})(.{2})(.{4})/$3$2$1/g for @F[1..2]; print join(";",@F) ' sadhiya.txt
Frank;20190101;20200101;woodcrest wack st
Mark;20190101;20200101;Annunciation st
Fred;20190201;20200101;Baker st