Bash脚本:将.csv文件中的日期时间列转换为Unix时间戳

7

我正在尝试创建一个脚本,将.csv文件中的日期和时间两列转换为Unix时间戳。因此,我需要获取每行的日期和时间列,将其转换并插入到末尾包含时间戳的附加列中。

有人能帮助我吗?到目前为止,我已经发现了将任何给定的时间和日期转换为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,

Thanks so much in advance!


你能否包含一些CSV文件的示例行? - ajreal
没问题,我已经在问题中加入了它,谢谢。 - Euan Hume
仅转换而非解析部分:https://dev59.com/iGgu5IYBdhLWcg3w6bGo - Ciro Santilli OurBigBook.com
3个回答

7

由于您没有提供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

(编辑:删除了一个不必要的变量。)

(编辑2:修改了日期命令,使脚本实际运行。)


谢谢你的帮助:我已将它放入一个shell脚本中,如下所示:#!/ltd/bin/bashcat myfile.csv | while read line ; do t=$(echo $line | tr ',' ' '); echo $line;$(date -d "$t" "+%s") ; done当我运行它时,我得到了“illegal option --d”的错误?另外,我是否正确地假设我需要用逗号替换分号,因为我有一个逗号分隔的文件而不是分号分隔的文件? - Euan Hume
将其作为一行代码运行并进行测试,然后再将其放入脚本文件中以查看是否适合您的需求。如果您使用分号分隔的 CSV 文件,则需要将 ';' 更改为 ',' - bos
1
@bos,您可以使用echo ${line}\;$(date -d "${line//;/ }" +'%s');来缩短while循环的循环部分。不需要使用echo和tr来获取正确的日期字符串。因此,这可以在原地完成。 - f4m8
你也可以删除 $t 变量,因为它没有被使用。我不知道当时为什么留下了它。现在已经将其删除并编辑了帖子。 - bos
date -d 后面的 "$t" 到底是什么意思? - Youda008
"$t"是之前脚本中遗留下来的被忘记的变量。 - bos

2

现在有两个改进:

第一:不需要使用cat foo.csv,只需通过< foo.csv流传递到while循环中。

第二:无需使用echo & tr来创建日期字符串格式。只需使用bash内部模式和替换,并在原地进行操作即可。

while read line ; do echo ${line}\;$(date -d "${line//;/ }" +'%s'); done < foo.csv

2
这应该可以完成工作:
 awk  'BEGIN{FS=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  'BEGIN{FS=OFS=", "}{t=$1" "$2; "date -d \""t"\"  +%s"|getline d; print $1,$2,d}'
2011/11/25, 10:00:00, 1322211600

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接