用于将日期和时间列转换为 .csv 中的 unix 时间戳的 Bash 脚本
Posted
技术标签:
【中文标题】用于将日期和时间列转换为 .csv 中的 unix 时间戳的 Bash 脚本【英文标题】:Bash script to convert a date and time column to unix timestamp in .csv 【发布时间】:2012-01-06 05:52:22 【问题描述】:我正在尝试创建一个脚本来将 .csv 文件中的两列日期和时间转换为 unix 时间戳。所以我需要从每一行获取日期和时间列,将其转换并插入到包含时间戳的末尾的附加列中。
谁能帮帮我?到目前为止,我发现了将任何给定时间和日期转换为 unixstamp 的 unix 命令:
date -d "2011/11/25 10:00:00" "+%s"
1322215200
我没有 bash 脚本编写经验,谁能帮我入门?
我的列和行示例:
Columns: Date, Time,
Row 1: 25/10/2011, 10:54:36,
Row 2: 25/10/2011, 11:15:17,
Row 3: 26/10/2011, 01:04:39,
提前非常感谢!
【问题讨论】:
您能否在 csv 文件中包含几行示例? 没问题,加入问题,干杯 只转换不解析部分:***.com/questions/10990949/… 【参考方案1】:这应该可以完成工作:
awk 'BEGINFS=OFS=", "t=$1" "$2; "date -d \""t"\" +%s"|getline d; print $1,$2,d' yourCSV.csv
注意
你没有举任何例子。并且您提到了 csv,所以我假设您文件中的列分隔符应该是“逗号”。
测试
kent$ echo "2011/11/25, 10:00:00"|awk 'BEGINFS=OFS=", "t=$1" "$2; "date -d \""t"\" +%s"|getline d; print $1,$2,d'
2011/11/25, 10:00:00, 1322211600
【讨论】:
【参考方案2】:您没有提供 csv 文件的摘录,所以我使用的是这个:
[foo.csv]
2011/11/25;12:00:00
2010/11/25;13:00:00
2009/11/25;19:00:00
这是解决问题的一种方法:
$ cat foo.csv | while read line ; do echo $line\;$(date -d "$line//;/ " "+%s") ; done
2011/11/25;12:00:00;1322218800
2010/11/25;13:00:00;1290686400
2009/11/25;19:00:00;1259172000
(编辑:删除了一个不必要的变量。)
(EDIT2:更改了日期命令,以便脚本实际运行。)
【讨论】:
感谢您的帮助:我已将其放入 shell 脚本中,如下所示:#!/ltd/bin/bash cat myfile.csv |而读线; do t=$(echo $line | tr ',' ' '); echo $line\;$(date -d "$t" "+%s") ;当我运行它时,我得到了错误非法选项--d 吗?我也可以正确地假设我需要替换';'用 ',' 因为我有一个逗号分隔的文件,而不是分号分隔的文件? 将其作为单行程序运行并在将其放入脚本文件之前对其进行测试以查看它是否适合您。是的,如果您使用分号分隔的 csv 文件,则需要将';'
更改为 ','
。
@bos 您可以使用 echo $line\;$(date -d "$line//;/ " +'%s');
缩短 while 循环的循环部分,无需 echo 和 tr 即可获得正确的日期字符串。所以这可以就地完成。
您也可以删除 $t 变量,因为它没有被使用。我不知道为什么我把它放在那里。删除它并编辑帖子。
"$t"
后面的 date -d
到底是什么意思?【参考方案3】:
现在有两个改进:
首先:不需要 cat foo.csv,只需通过
第二:不需要 echo & tr 创建日期字符串格式。只需使用 bash 内部模式并替换并就地执行
while read line ; do echo $line\;$(date -d "$line//;/ " +'%s'); done < foo.csv
【讨论】:
以上是关于用于将日期和时间列转换为 .csv 中的 unix 时间戳的 Bash 脚本的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java 将 unix 纪元的列转换为 Apache spark DataFrame 中的日期?