Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 获取两个日期列之间的分钟差_Shell - Fatal编程技术网

Shell 获取两个日期列之间的分钟差

Shell 获取两个日期列之间的分钟差,shell,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"|

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

源文件

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

请帮帮我

您的示例输出不正确

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
#/usr/bin/perl
严格使用;
使用警告;
使用DateTime qw();
使用DateTime::Format::strtime qw();
my$format=DateTime::format::strtime->new(
模式=>“%Y%m%d%H:%m:%S”,
);
打开(文件“”);
while()
{
my@arr=split/|/,$;
差额分钟$arr[0]$arr[1]
}
次差分
{
my($istart,$istop)=($uU0],$U1]);
my$start=$format->parse_datetime($0]);
my$stop=$format->parse_datetime($u[1]);
$\->为$start、$stop设置\u时区('local');
打印“$istart |$istop |”;
打印($start->delta_-ms($stop)->以_单位('minutes'),“\n”);
}
  • 注意:但这未经测试

迄今为止尝试了任何可以让人们参与的方法?这可以帮助您:。因此
date1=$(date-d“20121224 22:16:10”“+%s”)
,与date2相同,然后使用减法。感谢Kent的回复。。。。但使用示例命令sh:+%s:command未找到时出现以下错误
#!/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" );
}
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