如果没有值,则在文件中添加零值

时间:2013-06-08 13:16:51

标签: linux perl shell unix db2

我有一个select查询,它获取特定小时的所有订单(抱歉我稍后会复制db2查询),结果将存储在sample.txt文件中

输出如下,sample.txt

Time   orders
12 AM  2000
1 AM   1000
2 AM   3000
3 AM   1500
5 AM   1900
6 AM   1000

查询中没有问题,在上面的sample.txt 4AM值中缺失。实际上在凌晨4点没有订单,所以逻辑上我的db2查询是正确的

但是我也想添加零订单时间,我希望输出如下

Time   orders
12 AM  2000
1 AM   1000
2 AM   3000
4 AM    0
3 AM   1500
5 AM   1900
6 AM   1000

如果在特定小时没有下订单,我想打印零。我在Unix shell脚本中使用这个sample.txt。有任何建议来实现这一目标提前致谢

2 个答案:

答案 0 :(得分:1)

这个怎么样?这是相当自我放纵,但确实有效!

package Time;

use strict;
use warnings;

use overload
  '='  => \&copy,
  '++' => \&increment,
  '""' => \&to_string;

sub new {
  my $class = ref $_[0] || $_[0];
  bless [ split ' ', $_[1] ], $class;
}

sub copy {
  my ($self) = @_;
  my $class = ref $self;
  bless [ @$self ], $class;
}

sub increment {
  my ($self) = @_;
  $self->[0] -= 12 if ++$self->[0] > 12;
  $self->[1] =~ tr/AP/PA/ if $self->[0] == 12;
}

sub to_string {
  my ($self) = @_;
  join ' ', @$self;
}

package main;

use strict;
use warnings;

my $next;

while (<DATA>) {
  if ( /^(\d+\s+[AP]M)\s+(\d+)/ ) {
    $next = Time->new($1) unless $next;
    until ( /^$next/ ) {
      printf "%s %6d\n", $next++, 0;
    }
    $next++;
  }
  print;
}

__DATA__
Time   orders
12 AM  2000
1 AM   1000
2 AM   3000
3 AM   1500
5 AM   1900
6 AM   1000

<强>输出

Time   orders
12 AM  2000
1 AM   1000
2 AM   3000
3 AM   1500
4 AM      0
5 AM   1900
6 AM   1000

答案 1 :(得分:0)

使用from&amp ;;设置一个简单的时间范围定义表。到时间,然后计算每个范围内有多少行。某些范围可能没有行。