2013-05-28 150 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