【问题标题】:Convert date to timestamp in bash (with miliseconds)将日期转换为 bash 中的时间戳(以毫秒为单位)
【发布时间】:2017-07-11 10:14:28
【问题描述】:

我有以下格式的 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 魔法,将不胜感激。谢谢!

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

【问题讨论】:

  • 我认为告诉我们你想要什么(预期的输出)会帮助你更快地得到答案。
  • 对不起!请查看已编辑帖子的最后一行
  • 请给出所需输出的明确示例

标签: bash csv awk sed timestamp


【解决方案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 以所需的格式输出数据。

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

    • 我得到一个语法错误:awk: line 1: syntax error at or near ,
    【解决方案3】:

    日期接受原始格式作为时间戳。你不需要 sed 它。我相信您的输出中需要"date,milliseconds since 1970-01-01 00:00:00 UTC"。在 bash 中试试这个。

    生成输出.sh

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

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

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

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

    split -l 100000 -d <filename>
    

    为每个此文件和tee -a 输出并行运行generateoutput.sh

    ls -l x* | awk '{print $9}' | xargs -n1 -P4 generateoutput.sh | tee -a output.csv
    

    【讨论】:

    • 成功了!非常感谢!当我得到代表时,我会支持你的答案!你真的让我免于在这个浪费另一个晚上:)
    • @krq 如果它有效并解决了您的问题,您可以接受答案:stackoverflow.com/help/someone-answers
    • 您好,再次感谢您的帮助,但不幸的是,我需要重新打开此问题。我的文件非常大(1.4 GB),这个脚本持续了 24 小时,仍然需要几个小时才能完成。我需要一个更快的解决方案,因为我需要经常执行此活动
    • 您应该将其拆分为每个 10k 行的文件。然后在每个文件上运行上面的脚本。使用 xargs 并行运行它。
    猜你喜欢
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2020-06-24
    • 2022-11-27
    • 2021-09-29
    • 2016-04-22
    • 2015-06-17
    • 1970-01-01
    相关资源
    最近更新 更多