给定一个包含日期作为子字符串的字符串,如何将该子字符串从一种日期格式转换为另一种日期格式?更具体地说,我有以下问题:
如何将日期字符串“10/24/2017 8:00:00 AM”转换为日期字符串“20171024 8:00:00 AM”?
如何将“Data1|Data2|Data3|10/24/2017 8:00:00 AM”转换为“Data1|Data2|Data3|20171024 8:00:00 AM”?
如果我有一个名为“Sample.csv”的文件,其中包含这种形式的行(即管道分隔的数据),如何转换“Sample.csv”每一行中的日期(如上一个问题)?
答案1
这是date
您要查找的命令:
date -d '${DATE_STRING}' '+%Y%m%d %H:%M:%S %p'
-d
(等效)标志--date
用于指定表示日期/时间输入的字符串。手册对此是这样说的:
日期字符串
--date=STRING 是一个大多数自由格式的人类可读日期字符串,例如“Sun, 29 Feb 2004 16:21:42 -0800”或“2004-02-29 16:21:42”甚至“下周四” 。日期字符串可以包含指示日历日期、一天中的时间、时区、星期几、相对时间、相对日期和数字的项目。空字符串表示一天的开始。日期字符串格式比此处轻松记录的更复杂,但在信息文档中有完整描述。
使用您帖子中给出的日期字符串,上面的示例将如下所示:
date -d '10/24/2017 8:00:00 AM' '+%Y%m%d %H:%M:%S %p'
如果您想从您给出的示例中的完整字符串中提取日期,那么您可以这样做:
DATE_STRING="Data1|Data2|Data3|10/24/2017 8:00:00 AM"
date -d "$(echo "${DATE_STRING}" | cut -d'|' -f4)" '+%Y%m%d %H:%M:%S %p'
要获得单个字符串所需的最终结果,您可以执行如下操作:
DATE_STRING="Data1|Data2|Data3|10/24/2017 8:00:00 AM"
echo "$(echo "${DATE_STRING}" | cut -d'|' -f1,2,3)|$(date -d "$(echo "${DATE_STRING}" | cut -d'|' -f4)" '+%Y%m%d %H:%M:%S %p')"
最后,要在文件中的每一行运行此命令,您可以执行以下操作:
while read line; do echo "$(echo "${DATE_STRING}" | cut -d'|' -f1,2,3)|$(date -d "$(echo "${DATE_STRING}" | cut -d'|' -f4)" '+%Y%m%d %H:%M:%S %p')"; done < Sample.csv