Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中将日期转换为时间戳(以毫秒为单位)_Bash_Csv_Awk_Sed_Timestamp - Fatal编程技术网

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

在bash中将日期转换为时间戳(以毫秒为单位),bash,csv,awk,sed,timestamp,Bash,Csv,Awk,Sed,Timestamp,我有以下格式的CSV文件 20170102 00:00:00.803, 20170102 00:00:01.265, 20170102 00:00:05.818, 我成功地用 sed-r的#(.{4})(.{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

我有以下格式的CSV文件

20170102 00:00:00.803,
20170102 00:00:01.265,
20170102 00:00:05.818,
我成功地用

sed-r的#(.{4})(.{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魔法,我将不胜感激。谢谢


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

原始格式被日期接受为时间戳。你不必担心。我相信您需要在输出中输入自1970-01-01 00:00:00 UTC以来的日期(毫秒)。在bash中试试这个

generateoutput.sh

#!/bin/bash

while read -r line
do
  echo -n $line,
  echo `date -d "$line" "+%s%N"` / 1000000 | bc 
done < <(sed 's/,//g' $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函数),然后使用print以所需格式输出数据。

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

我认为告诉我们您想要什么(预期输出)将有助于您更快地得到答案。对不起!请看编辑后的最后一行。请给出所需输出的清晰示例。它成功了!非常感谢!当我得到代表时,我会投票支持你的答案!你真的让我不用再浪费一个晚上:)@krq如果它能解决你的问题,你可以接受答案:你好,再次感谢你的帮助,但不幸的是我需要重新打开这个问题。我的文件相当大(1.4GB),这个脚本持续24小时,仍然需要几个小时才能完成。我需要一个更快的解决方案,因为我需要经常执行此活动。您应该将其拆分为每个10k行的文件。然后在每个文件上运行上面的脚本。使用xargs并行运行。我得到一个语法错误:awk:line 1:syntax error at或near,
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