Date 当原件为dd-mm-yyyy格式时,如何将日期转换为unixtime

Date 当原件为dd-mm-yyyy格式时,如何将日期转换为unixtime,date,awk,Date,Awk,我正在使用下面的来浏览一个CSV文件,并将第二列中的所有日期替换为unixtime等效日期 gawk -F',' -v OFS=',' '$2 {cmd="date -d \""$2"\" +%s"; cmd | getline $2; close(cmd)} 1' C.csv > D.csv 然而,我得到的是: date: invalid date ‘21-07-2019 13:08’ date: invalid date ‘21-07-2019 14:59’ date: inval

我正在使用下面的来浏览一个CSV文件,并将第二列中的所有日期替换为unixtime等效日期

gawk -F',' -v OFS=','  '$2 {cmd="date -d \""$2"\" +%s"; cmd | getline $2; close(cmd)} 1' C.csv > D.csv
然而,我得到的是:

date: invalid date ‘21-07-2019 13:08’
date: invalid date ‘21-07-2019 14:59’
date: invalid date ‘20-07-2019 13:03’
date: invalid date ‘20-07-2019 14:44’
date: invalid date ‘20-07-2019 15:19’
date: invalid date ‘20-07-2019 13:36’
date: invalid date ‘21-07-2019 11:37’
date: invalid date ‘20-07-2019 14:51’
日期是有效的-为什么不承认它是有效的

它适用于:

date -d '07/22/2019 11:37'
另一个问题是,此列包含混合的日期类型,即上面的日期类型和一些格式为
2019-07-18T14:15:00.000+02:00


谢谢

因为您有混合的日期格式,您必须将
dd-mm-yyyy-HH:mm
格式转换为
mm-dd-yyyy-HH:mm
,您可以尝试以下方法:

/*date.awk*/

{
    if($2 ~ / /) {
        split($2,datetime, / /)
        dt = date[1]
        split(dt, dts, /-/)
        $2 = dts[2]"-"dts[1]"-"dts[3]" "date[2]
    }
}
{cmd = "date -d \""$2"\" \"+%Y-%m-%d %I:%M:%S %p\""}{ cmd|getline D; close(cmd); $2=D}1


那么


应该可以得到您所需要的。

因为您正在使用GNU awk,所以可以使用它的

请注意,这将根据您的本地时区转换为unixtime。Unix时间是UTC,您的本地时区可能有夏令时修正。如果文件中的时间在给定的时区内,例如欧洲/摩纳哥。那么你应该在完全相同的时区进行转换

$ TZ='Europe/Monaco' awk '{...}' file

你确定吗?如果我运行
date-d'21-07-2019 13:08'
我会得到相同的错误。是的,我会得到一个错误…你可以尝试
awk-v FS=,-v of S=,{cmd=“date-d\”$2“\”+%Y-%m-%d%I:%m:%S%p\”}{cmd getline d;close(cmd);$2=d}1'C.csv
对不起,我更新了问题,说在你的问题中有混合数据类型要包括简明数据,可测试的样本输入和预期输出为我们能够帮助您。另外,was
使用gawk对其进行了排序
,因此您应该使用gawks内置的时间函数,而不是在每个输入行生成一个shell来调用
日期
。请不要等到您使用
date
获得答案后再拒绝,因为您再次使用gawk解决了问题。
awk 'BEGIN{FS=OFS=","}
     { timestring=$2":00"; gsub(/[-:]/," ",timestring);
       $2=mktime(timestring)
     }1' file
$ TZ='Europe/Monaco' awk '{...}' file