我有两个文本文件。第一个文件具有开始日期时间,第二个文件具有结束日期时间。
文件 1 数据(开始日期-时间):
2019-01-08 04:14:59
2019-01-08 04:16:57
文件2数据(结束日期-时间):
2019-01-08 04:15:50
2019-01-08 04:17:02
我需要 Unix 脚本,它将在结束时间 - 开始时间(仅按时间)执行操作。它应该执行的第一个条目的示例:
04:15:50 - 04:14:59
并给出以秒为单位的结果(对于本例,它应该打印总差秒数)
答案1
有一组跨平台的命令行实用程序,称为日期工具其中包括一个datediff
命令。如果您使用的是 Linux,则很有可能dateutils
使用包管理器进行安装。
您还没有说明您是否想要在 Linux、Mac、BSD 还是其他 Unix 上使用此功能,因此以下内容可能需要根据您的需求进行调整,但它在 Arch Linux 上适用于我:
$ paste start.txt end.txt | sed 's/ /T/g' | while read dates; do datediff $dates; done
51s
5s
解释
您可以将管道视为由两部分组成:while read dates; do datediff $dates; done
将任何输入提供datediff
给计算差异;将paste start.txt end.txt | sed 's/ /T/g'
原始数据预处理成适合消费的形式的部分datediff
。
特别是,考虑到您提供的示例输入,您需要担心转义空格;如果数据保留其原始形式,datediff
则会认为文件中的每个空格都表示一个单独的参数。例如,这不是合适的输入:
$ paste start.txt end.txt
2019-01-08 04:14:59 2019-01-08 04:15:50
2019-01-08 04:16:57 2019-01-08 04:17:02
因此,我用sed
, 替换空格(不是制表符)T
,以匹配手册中的一些示例datediff
( man datediff
):
$ paste start.txt end.txt | sed 's/ /T/g'
2019-01-08T04:14:59 2019-01-08T04:15:50
2019-01-08T04:16:57 2019-01-08T04:17:02
现在,该数据在预期参数之间只有空格,并且每个参数的形式都与手册中提供的示例相匹配。
答案2
bash
使用GNU 的解决方案date
:
#!/bin/bash
while IFS= read -r -u3 line1; do
IFS= read -r -u4 line2
start_date="$line1"
end_date="$line2"
difference=$(( $(date -d "$end_date" "+%s") - $(date -d "$start_date" "+%s") ))
echo "Start Date: $start_date; End Date: $end_date; Difference in seconds = $difference"
done 3<start-times.txt 4<end-times.txt
文件描述符 3 和 4 用于从两个文件中读取,一次读取一行。从那里,GNU date 命令用于将它们转换为纪元时间。 Bash 的算术扩展用于计算差异。
示例输出:
Start Date: 2019-01-08 04:14:59; End Date: 2019-01-08 04:15:50; Difference in seconds = 51
Start Date: 2019-01-08 04:16:57; End Date: 2019-01-08 04:17:02; Difference in seconds = 5