2013-05-28 100 views
0

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

源文件

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 

请帮我我得到下面的错误!

+0

尝试新鲜事物,到目前为止,使人们可以在场上? – vpram86

+0

这可以帮助您:http://unix.stackexchange.com/a/24636。所以'date1 = $(date -d“20121224 22:16:10”“+%s”)',与date2相同,然后减去。 – fedorqui

回答

1

您的示例输出是而不是正确。

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

告诉我为什么差异(以分钟为单位)是73?反正它应该小于60!

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

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 
+0

非常感谢Kent的回复....但是我使用示例命令时遇到了以下错误: sh:+%s:command not found –

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"); 
} 
  • 注:这是不是虽然测试。
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