unix shell 脚本 - 从两个 .txt 文件中提取结果(时间操作)

unix shell 脚本 - 从两个 .txt 文件中提取结果(时间操作)

我有两个文本文件。第一个文件具有开始日期时间,第二个文件具有结束日期时间。

文件 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

相关内容