将日期转换为bash中的时间戳(以毫秒为单位)

时间:2017-07-11 10:14:29

标签: bash csv awk sed timestamp

我有以下格式的CSV文件

20170102 00:00:00.803,
20170102 00:00:01.265,
20170102 00:00:05.818,

我设法用

添加斜杠

sed -r 's#(.{4})(.{2})(.{2})(.{2})(.{2})#\1/\2/\3 \4:\5:#' file.csv > newfile.csv

如下所示,以启用到时间戳的转换

2017/01/02 0:0::00:00.803
2017/01/02 0:0::00:01.265
2017/01/02 0:0::00:05.818

但是在使用

之后
cat newfile.csv | while read line ; do echo $line\;$(date -d "$t" "+%s%N") ; done > nextfile.csv 

我得到了:

2017/01/02 0:0::00:00.803,1499727600000000000
2017/01/02 0:0::00:01.265,1499727600000000000
2017/01/02 0:0::00:05.818,1499727600000000000

我的数据可能有些不对劲,但是我太过初学者才能获得缺失值。如果你能给我一些sed / awk魔法,我将非常感激。谢谢!

编辑:我需要有一个毫秒的时间戳,但我现在得到的只是零(多么典型)

3 个答案:

答案 0 :(得分:1)

不确定这是否是您所追求的,但您可以解析没有日期的输出以形成日期戳。

awk '{ print substr($0,1,4)"/"substr($0,5,2)"/"substr($0,7,2)" "substr($0,10,2)":"substr($0,13,2)":"substr($0,16) }' dates.csv

我们使用awk提取有关日,月,年等的行提取(substr function),然后使用print以所需格式输出数据。

答案 1 :(得分:0)

原始格式被日期接受为时间戳。你不需要它。我相信你的输出需要Install-Package : An error occurred while retrieving package metadata for 'Newtonsoft.Json.10.0.3' from source 'C:\Path\packages'. At line:1 char:1 + Install-Package EntityFramework -IncludePrerelease + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Install-Package], Exception + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PackageManagement.PowerShellCmdlets.InstallPackageCommand 。在bash中试试这个。

generateoutput.sh

"date,milliseconds since 1970-01-01 00:00:00 UTC"

其中timestamp.csv是原始格式的文件。

bc - 基本计算器,将纳秒转换为毫秒

逐行解析大文件必然需要时间。 如果您需要更好的性能,请拆分原始文件。我建议在新目录中执行此操作

#!/bin/bash

while read -r line
do
  echo -n $line,
  echo `date -d "$line" "+%s%N"` / 1000000 | bc 
done < <(sed 's/,//g' $1)

为每个文件和split -l 100000 -d <filename> 输出

并行运行generateoutput.sh
tee -a

答案 2 :(得分:0)

gawk 解决方案:

awk -F',' '{ match($1,/^([0-9]{4})([0-9]{2})([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{3})/,a); 
           print mktime(sprintf("%d %d %d %d %d %d",a[1],a[2],a[3],a[4],a[5],a[6]))*1000 + a[7] }' file.csv

输出:

1483308000803
1483308001265
1483308005818