Aqui está o comando date
que você está procurando:
date -d '${DATE_STRING}' '+%Y%m%d %H:%M:%S %p'
O sinalizador -d
(equivalentemente --date
) é usado para especificar uma cadeia que representa a entrada de data / hora. O manual tem isto a dizer sobre isso:
DATE STRING
The --date=STRING is a mostly free format human readable date string such as "Sun, 29 Feb 2004 16:21:42 -0800" or "2004-02-29 16:21:42" or even "next Thursday". A date string may contain items indicating calendar date, time of day, time zone, day of week, relative time, relative date, and numbers. An empty string indicates the beginning of the day. The date string format is more complex than is easily documented here but is fully described in the info documentation.
Com a string de data fornecida em sua postagem, o exemplo acima ficaria assim:
date -d '10/24/2017 8:00:00 AM' '+%Y%m%d %H:%M:%S %p'
Se você quiser extrair a data da string completa no exemplo que você deu, faça o seguinte:
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'
Para alcançar o resultado final desejado para uma única string, você pode fazer algo como o seguinte:
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')"
E, finalmente, para executar este comando em todas as linhas do arquivo, você poderia fazer algo assim:
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