2016-05-30 137 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記錄每分鐘的實際數量是安全的。