【问题标题】:Calculating time difference between two dates using linux使用linux计算两个日期之间的时间差
【发布时间】:2021-09-11 09:19:36
【问题描述】:

早上好。我有两个名为 a.txt 和 b.txt 的文本文件,其中包含以下格式的数据

year mn dt hr:mn:sec
xxxx-xx-xx xx:xx:xx.xxxxxx

我的 a.txt 文件是

2019-01-01 00:58:49.925000
2019-01-01 01:48:39.665000


2019-01-01 15:42:18.955000

2019-01-01 18:40:49.915000
2019-01-01 18:47:00.735000

2019-01-01 21:07:49.255000
2019-01-01 21:52:29.055000
2019-01-02 03:19:54.955000
2019-01-02 07:41:27.845000
2019-01-02 18:52:32.995000

而b.txt文件包含

2019-01-01 00:58:50.565000
2019-01-01 01:48:39.915000
2019-01-01 04:09:53.705000
2019-01-01 06:28:07.515000

2019-01-01 15:43:13.455000
2019-01-01 18:40:53.255000
2019-01-01 18:47:04.005000
2019-01-01 18:47:03.975000
2019-01-01 21:07:53.725000
2019-01-01 21:52:37.195000

2019-01-02 07:41:34.255000
2019-01-02 19:41:08.865000

此外,每个文本文件(a.txt 和 b.txt)都包含 14 行,包括空格。

现在我想以秒为单位计算每行 (a.txt-b.txt) 之间的时间差,并且我想将这些行附加到一个新的文本文件 c.txt,它应该只包含时间差在 3 到 18 秒之间的行.

我做了如下的事情:

#!/bin/sh
a=`cat a.txt`
b=`cat b.txt`
awk '{print $a-$b}' 

【问题讨论】:

  • 如果其中一个日期为空怎么办?例如,在示例文件的第三行中。
  • 空白行呢?你想如何区分它们? a.txt 有 10 个日期,而 b.txt 有 12 个日期。
  • 如果空结果应该为零
  • 空结果是什么意思?空行?假设空白行的日期为 0?还是直接返回 0?
  • 是的..我假设空行为零,因为行值不存在,其结果应该为零

标签: linux bash for-loop awk


【解决方案1】:

根据对您问题的一种可能解释,将 GNU awk 用于 mktime():

$ cat tst.awk
!NF { next }
{ gsub(/[-:]/," ") }
NR==FNR {
    file1[NR] = $0
    next
}
FNR in file1 {
    diff = mktime($0) - mktime(file1[FNR])
    if ( (3 <= diff) && (diff <= 18) ) {
        print diff
    }
}

$ awk -f tst.awk a.txt b.txt
4
4
4
8
7

显然只需添加 &gt; c.txt 即可重定向输出。

如果这不是您需要的,请编辑您的问题以阐明您的要求并根据您发布的示例输入提供预期的输出。

【讨论】:

    【解决方案2】:

    使用date -d "2019-01-01 …" +%s 将每个日期转换为unix 时间。然后减去unix次。这仅考虑整秒。您的日期包括几分之一秒。如果您也想使用分数,请将+%s 更改为+%s.%N。

    以下脚本包含您的所有额外要求,请参阅此答案的评论部分。

    paste a.txt b.txt |
    awk '
    function inSecs(date) {
      cmd = "date -d \""date"\" +%s"
      cmd | getline unixTime
      close(cmd)
      return unixTime
    }
    {
      if (NF == 4) {
        diff = inSecs($1" "$2) - inSecs($3" "$4)
        if (3 <= diff && diff <= 18)
          print $1 " " diff "sec"
      } 
    }'
    

    【讨论】:

    • 但有时在 a.txt 行中错过了,而在 b.txt 行中出现在这种情况下我希望输出为零...请您修改一次脚本..
    • 但是,我需要在结果之前以 yyyy-mn-day 格式附加日期,我的意思是结果应该类似于 2019-01-01 1sec
    • @dtutub 如果您提出问题,请使其完整,而不是在每次回答后添加新内容。话虽如此,我不明白您预期的输出格式。如果减去2019-01-02 03:04:05.0 和2019-01-01 01:01:01.0 这两个日期,那么预期的输出是什么?
    • 请更新先生的答案,因为我也需要日期。我做了类似 print date inSecs($1)-inSecs($2) ...它没有给出我希望的结果
    • 我认为在我的情况下日期相似,只是时间变化
    猜你喜欢
    • 2021-11-25
    • 2011-08-01
    • 2021-08-14
    • 1970-01-01
    • 2021-10-09
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多