使用Awk将时间戳数据从每秒转换为每分钟的更好方法

时间:2016-05-30 05:30:17

标签: bash 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

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

请查看以下Select * From tempdb.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE '#yourtemp%' 代码:

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; }

运行

答案 1 :(得分: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. 对于每一行,分割字段中的行(m / ...行)&amp;
  2. 积累价值&amp;哈希的长度名为arr&amp; len。分别。
  3. 最后,打印平均值。
  4. 你可以跳过逻辑和电路的长度部分。硬编码为60.但IMO,记录每分钟的实际参赛人数更安全。