2016-05-30 144 views
1

我试图从每秒钟到每分钟(以当天所有数值的平均值为单位)汇总数据。我的数据的时间戳的形式为:使用Awk将时间戳数据从每秒钟转换为每分钟的更好方法

date time[h:m:s-03:00],X,value 
2016-05-29 15:50:33-03:00,X,561 
2016-05-29 15:50:34-03:00,X,565 
.... 

我已经破解我的方式与下面的代码的答案,但我想找到一个更好的,更清洁的方式做到这一点:

awk -F: 'BEGIN{ 
    foo_total=0; 
    foo=0; } 

    { 
    split($4,ar,","); 
    foo=ar[3]; 
    split($3,a,"-"); 
    if(a[1]~"00"){ 
      first_foo=ar[3]} 
    if(a[1]!~"00"){ 
      foo_total+=ar[3]} 

    foo_sum=(first_foo + foo_total); 
    foo_final=foo_sum/60 
    if(a[1]~"59") {printf $1":"$2","foo_final"\n"; foo_total=0; first_foo=0;} }' MyFile.csv 

非常感谢您的帮助!

+1

请指定样本输入和预期输出以及相同的说明。 – piyushj

+0

另一方面,你不应该在没有格式字符串的情况下使用'printf'(用任何编程语言,awk,c,bash等)。 'printf stringvariable'可以正确写成'printf'%s“,stringvariable' – anishsane

回答

1

请看看下面的awk代码:

BEGIN { total = 0; DayHour="Empty"; Min="";} 
{ 
    if((DayHour ~ $1) && (Min ~ $2)) 
    { 
     split($4,a,","); 
     total += a[3]; 
    } 
    else 
    { 
      if(DayHour !~ "Empty") 
       print DayHour":"Min, total/60; 
      DayHour=$1; 
      Min=$2; 
      split($4,a,","); 
       total = a[3]; 
    } 
} 
END {print DayHour":"Min, total/60; } 

你运行它基于awk -F: -f progam <data_file>

1

perl的方法:

$ cat testdata 
2016-05-29 15:50:33-03:00,X,561 
2016-05-29 15:50:34-03:00,X,565 

$ perl -E 'my %arr; my %len; 
      while(<STDIN>){ 
       m/^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}):\d{2}-03:00,X,([0-9]*)/; 
       $arr{$1} += $2; $len{$1}++; 
      } 
      foreach my $key (sort keys %arr) { 
       print "$key-03:00,X,". ($arr{$key}/$len{$key}) . "\n"; 
      }' < testdata 

2016-05-29 15:50-03:00,X,563 

说明:

  1. 对于每个立ne,分割行(m/... line)&
  2. 累计值&哈希长度分别命名为arr & len。
  3. 最后打印出平均值。

您可以跳过逻辑的长度部分&将其硬编码为60.但是IMO记录每分钟的实际数量是安全的。