我是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命令回答。
答案 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
代表每个括号捕获的内容,即此处的DD
,MM
和YYYY
。 s
将替换为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