在管道分隔文件
I中重新格式化时间戳有一个管道分隔文件,其日期时间格式为yyyymmddhhmmss,如下所示。John
解答动态
Doe
TEST
20210728120821
john@test.com约翰
戴维斯测试20210828120821
john@test.com约翰
史密斯测试20210528120821
john@test.com I我正在尝试将第4列中的字符串转换为yyyy-mm-dd hh:mm:ss本
约翰能源部
测试
2021-07-28 12:08:21
john@test.com约翰
戴维斯测试2021-08-28 12:08:21
john@test.com约翰
史密斯
测试
2021-05-28 12:08:21
john@test.com As邮箱我对Linux中的文本处理还比较陌生,我搜索并尝试使用类似这样的awk
awk-F";quot;
quot;%Y-%m-%d%H:%m:%S";,$4);打印$0} 但它没有按预期进行转换。
这些“时间戳”不是strftime()操作的epoch之后的秒,它们只是日期+时间,年、月等之间没有分隔符。您只需要简单的文本操作,不使用时间函数。
与GNU awk(您已经在使用)for gensub():
$awk'BEGIN{FS=OFS=";quot;\\1-\\2-\\3\\4:\\5:\\6";,1,$4)}1'文件约翰
能源部
测试
2021-07-28 12:08:21
john@test.com约翰
戴维斯测试2021-08-28 12:08:21
john@test.com约翰
史密斯
测试
2021-05-28 12:08:21
john@test.com 或任何awk:
$awk'BEGIN{FS=OFS=";quot;%s-%s-%s%s:%s:%s";,substr($4,1,4),substr($4,5,2),substr($4,7,2),substr($4,9,2),substr($4,11,2),substr($4,13,2) )}1'文件约翰
能源部
测试
2021-07-28 12:08:21
john@test.com约翰
戴维斯测试2021-08-28 12:08:21
john@test.com约翰
史密斯
测试
2021-05-28 12:08:21
john@test.com
假设:要更改的字段是唯一或第一个正好包含14位数字的字段。
sed-E's=\([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})\\
=
\1-\2-\3\4: \5:\6
=' 您的尝试失败,因为$4需要是UNIX Epoch时间(自1970年以来以秒为单位的时间),正如GNU Awk手册文档所述。
如果您想使用类似strftime的方法,那么您可以考虑Miller,它还提供了相应的strtime ex.
$mlr--nidx--fs''put-S'$4=strftime(strftime($4,quot;),quot;)'文件约翰
美国能源部
测试
2021-07-28 12:08:21约翰
戴维斯
测试
2021-08-28 12:08:21约翰
史密斯
测试
2021-05-28 12:08:21
- End
免责声明:
本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。