获得两个日期列之间的分钟差异

时间:2013-05-28 09:19:06

标签: shell

我有一个包含两列的文件(开始日期时间和结束日期时间)我想计算这些日期之间的差异(以分钟为单位)。并将差异存储在另一列中。

源文件

20121224 22:16:10|20121224 23:03:34

输出文件

20121224 22:16:10|20121224 23:03:34|73

任何人都可以帮忙解决这个问题。任何帮助表示赞赏。

请告诉我下面的命令

有什么问题
echo "20121224 22:16:10|20121224 23:03:34"|awk -F'|' '{"date -d "$1" +%s"|getline d1;"date -d "$2" +%s"|getline d2;print $1"|"$2"|"d2-d1}'

我在执行命令

时遇到错误
sh: +%s: command not found

请帮助我!!

3 个答案:

答案 0 :(得分:1)

您的示例输出正确。

20121224 23:03:34
20121224 22:16:10

告诉我为什么差异(最小)是73?无论如何应该不到60岁!

这是一个为你的问题工作的awk oneliner:

awk -F'|' -v q='"' '{"date -d"q $1 q" +%s"|getline d1;"date -d"q $2 q" +%s"|getline d2;print $0"|"(d2-d1)/60}' file

用你的例子测试:

kent$  echo "20121224 22:16:10|20121224 23:03:34"|awk -F'|' -v q='"' '{"date -d"q $1 q" +%s"|getline d1;"date -d"q $2 q" +%s"|getline d2;print $0"|"(d2-d1)/60}'
20121224 22:16:10|20121224 23:03:34|47.4

答案 1 :(得分:0)

#!/usr/bin/perl

use strict;
use warnings;

use DateTime                   qw( );
use DateTime::Format::Strptime qw( );

my $format = DateTime::Format::Strptime->new(
    pattern => '%Y%m%d %H:%M:%S',
);

open(FILE,"<your_file_name_with_path>");

while(<FILE>)
{
my @arr=split /|/,$_;
difference_mins $arr[0] $arr[1]

}

sub difference_mins
{
my ($istart,$istop)=($_[0],$_[1]);
my $start = $format->parse_datetime( $_[0] );
my $stop  = $format->parse_datetime( $_[1] );

$_->set_time_zone('local') for $start, $stop;
print "$istart | $istop | ";
print( $start->delta_ms($stop)->in_units('minutes'), "\n" );
}
  • 注意:虽然未对此进行测试。

答案 2 :(得分:0)

awk -F '|' -v OFS='|' '
    function parse_date(d) {
        gsub(/:/, " ", d)
        return mktime(substr(d,1,4) " " substr(d,5,2) " " substr(d,7))
    }
    {
        diff = int((parse_date($1) - parse_date($2)) / 60)
        diff *= (diff < 0) ? -1 : 1   # awk is missing abs()
        print $0, diff
    }
' << END
20121224 22:16:10|20121224 23:03:34
END
20121224 22:16:10|20121224 23:03:34|47