2017-09-08 70 views
1

在平面文件我有以下的test.txt萃取柱和使用AWK

cat test.txt 
2017-08-26 15:38:51.4,1.6814,DEV,TEST 
2017-08-26 15:38:51.4,0.53080004,DEV,TEST 
2017-08-26 15:38:51.4,1.7757,DEV,TEST 
2017-08-26 15:38:51.4,0.5666,DEV,TEST 
2017-08-26 15:38:55.324,0.465,DEV,TEST 
2017-08-26 15:38:55.324,0.4734,DEV,TEST 
2017-08-26 15:38:55.324,1.6006,DEV,TEST 
2017-08-26 15:38:55.324,0.4886,DEV,TEST 
2017-08-26 15:38:55.324,1.6165,DEV,TEST 
2017-08-26 15:38:55.324,0.46879998,DEV,TEST 
2017-08-26 15:38:55.324,1.5161,DEV,TEST 
2017-08-26 15:38:55.324,3.1766,DEV,TEST 
2017-08-26 15:38:55.324,1.5461,DEV,TEST 
2017-08-26 15:38:55.324,1.5679,DEV,TEST 
2017-08-26 15:38:55.324,1.5355,DEV,TEST 
2017-08-26 15:38:55.324,0.49389997,DEV,TEST 
2017-08-26 15:38:55.324,0.50909996,DEV,TEST 
2017-08-26 15:38:55.325,1.7934,DEV,TEST 
2017-08-26 15:38:55.325,3.005,DEV,TEST 
2017-08-26 15:38:55.325,0.6599,DEV,TEST 
2017-08-26 15:38:55.325,0.5711,DEV,TEST 
2017-08-26 15:38:55.325,1.5683999,DEV,TEST 

我需要以下輸出

2017-08-26 15:38:51 4.5528 
      15:38:55 23.0402 

其中15時38分51秒聚集的值是時間戳以毫秒爲單位截斷並且4.5528是對應於15:38:51時間戳的所有值的總和

與15:38:55相同是截斷了毫秒的時間戳並且23.0402是所有值的總和correspo nding至15時38分55秒的時間戳

我想這awk命令

$

awk -F ".," '{a[$1] += $2} END{for (i in a) print i, a[i]}' test.txt 

2017-08-26 15:38:51. 4.5528 
2017-08-26 15:38:55.32 23.0402 

,但並不如預期的輸出。

應該不是在第一列 第二列顯示一次約會應該有截去和時間戳下的所有相應值的和在第三列

回答

0

AWK溶液:

awk -F'[[:space:],]' '{ a[$1, substr($2,1,index($2,".")-1)]+= $3 } 
    END{ for(k in a) { 
      split(k, keys, SUBSEP); 
      printf "%-10s %s %s\n",(!i++? keys[1]:""), keys[2], a[k] } 
    }' file 
  • -F'[[:space:],]' - 化合物字段分隔

  • substr($2,1,index($2,".")-1) -後截斷時間值的結束部分(即15:38:55.325變得15:38:55

  • a[$1, substr($2,1,index($2,".")-1)]+= $3 - 聚集值中的每個日期時間序列

  • split(k, keys, SUBSEP)爲 - 通過分離器拆分索引的序列

  • (!i++? keys[1]:"") - 僅在第一行打印日期值第一場


輸出:

2017-08-26 15:38:51 4.5545 
      15:38:55 23.0559 
0

您可以使用以下awk對應的時間戳的日期與毫秒腳本:

program.awk

BEGIN { 
    FS="," 
    OFS=" " 
} 
{ 
    sub(/\..*$/,"",$1) 
    split($1,dt," ") 
    d=dt[1] 
    t=dt[2] 
    if(!prv_t) { 
     prv_t = t 
    } 

    if(d!=prv_d) { 
     prv_d = d 
     f = 1 
    } 

    if(t!=prv_t) { 
     if(f) { 
      print prv_d,prv_t,s 
      f = 0 
     } else { 
      print "    ",prv_t,s 
     } 
     prv_t = t 
     s = 0 
    } 
    s+=$2 
} 

END { 
    if(f) { 
     print prv_d,prv_t,s 
     f = 0 
    } else { 
     print "   ",prv_t,s 
    } 
} 

這樣稱呼它:

awk -f program.awk input_file 
0

試試下面的awk過一次,讓我知道如果這可以幫助你。

awk -F'[ .,]' ' 
{ 
    a[$1,$2]+=$4"."$5 
} 
END{ 
    for(i in a){ 
    split(i, check," "); 
    if(check[1]==prev){ 
     print "\t ",check[2],a[i] 
} 
    else{ 
     print i,a[i] 
}; 
    prev=check[1] 
} 
} 
' SUBSEP=" " Input_file 

輸出如下。

2017-08-26 15:38:51 4.5545 
      15:38:55 23.0559