2011-12-17 72 views
1

想知道是否有人可以用正確的方向指向我使用bash shell腳本和awk添加幾個列/字段並打印出摘要。使用AWK添加幾個相應的列/字段的Bash shell?

我想在下面的格式

REQ_RATE REQ_PROCESSING: 0, REQ_PER_SEC: 1.0, TOT_REQS: 2, 
REQ_RATE CACHE_HITS_PER_SEC: 0.5, TOTAL_CACHE_HITS: 10 
REQ_RATE REQ_PROCESSING: 0, REQ_PER_SEC: 2.0, TOT_REQS: 0, 
REQ_RATE CACHE_HITS_PER_SEC: 0.5, TOTAL_CACHE_HITS: 20 
REQ_RATE REQ_PROCESSING: 0, REQ_PER_SEC: 3.0, TOT_REQS: 2, 
REQ_RATE CACHE_HITS_PER_SEC: 0.5, TOTAL_CACHE_HITS: 30 
REQ_RATE REQ_PROCESSING: 0, REQ_PER_SEC: 4.0, TOT_REQS: 1, 
REQ_RATE CACHE_HITS_PER_SEC: 0.5, TOTAL_CACHE_HITS: 40 
REQ_RATE REQ_PROCESSING: 0, REQ_PER_SEC: 5.0, TOT_REQS: 0, 
REQ_RATE CACHE_HITS_PER_SEC: 0.5, TOTAL_CACHE_HITS: 50 

輸出的統計和他們合計了一個線路輸出像

REQ_RATE REQ_PROCESSING: 0, REQ_PER_SEC: 15.0, TOT_REQS: 5, 
REQ_RATE CACHE_HITS_PER_SEC: 2.5, TOTAL_CACHE_HITS: 150 

感謝

+0

你需要awk嗎?這也可以在perl中完成 - 在python和其他許多腳本語言 – fge 2011-12-17 09:22:27

回答

3

awk是很容易使用。

$ awk '/REQ_PROCESSING/{x+=$3; y+=$5; z+=$7}; END{print x, y, z}' input.txt 
0 15 5 

我想你可以做剩下的事情。快樂的編碼!

+0

上謝謝Jaypal和kev,你的例子肯定幫助我理解了該怎麼做。看起來像kev的例子很簡單,只是我需要:) – p4guru 2011-12-17 10:38:08

1

這是否會爲你工作 -

文件:

[jaypal:~/Temp] cat file 
REQ_RATE REQ_PROCESSING: 0, REQ_PER_SEC: 1.0, TOT_REQS: 2, 
REQ_RATE CACHE_HITS_PER_SEC: 0.5, TOTAL_CACHE_HITS: 10 
REQ_RATE REQ_PROCESSING: 0, REQ_PER_SEC: 2.0, TOT_REQS: 0, 
REQ_RATE CACHE_HITS_PER_SEC: 0.5, TOTAL_CACHE_HITS: 20 
REQ_RATE REQ_PROCESSING: 0, REQ_PER_SEC: 3.0, TOT_REQS: 2, 
REQ_RATE CACHE_HITS_PER_SEC: 0.5, TOTAL_CACHE_HITS: 30 
REQ_RATE REQ_PROCESSING: 0, REQ_PER_SEC: 4.0, TOT_REQS: 1, 
REQ_RATE CACHE_HITS_PER_SEC: 0.5, TOTAL_CACHE_HITS: 40 
REQ_RATE REQ_PROCESSING: 0, REQ_PER_SEC: 5.0, TOT_REQS: 0, 
REQ_RATE CACHE_HITS_PER_SEC: 0.5, TOTAL_CACHE_HITS: 50 

測試:

[jaypal:~/Temp] sed '{N;s/\n/ /g'} file | 
awk -F"[:,]" '{a=a+$2;b=b+$4;c=c+$6;d=d+$8;e=e+$10} 
END{printf ("%s: %.1f,%s: %.1f,%s: %.1f,\n%s: %.1f,%s: %.1f\n", $1,a,$3,b,$5,c,$7,d,$9,e)}' 
REQ_RATE REQ_PROCESSING: 0.0, REQ_PER_SEC: 15.0, TOT_REQS: 5.0, 
REQ_RATE CACHE_HITS_PER_SEC: 2.5, TOTAL_CACHE_HITS: 150.0 
1

如果我們考慮到數據的結構,有幾個得出結論:

  • REQ_RATE不攜帶信息
  • 這些線的剩餘部分可以
  • 的鍵 - 值對由逗號或者行分隔打破

被視爲鍵 - 值對因此,需要一個兩個步驟方法,將行處理爲清除鍵值對:

sed -e 's/^REQ_RATE //' -e 's/,[[:space:]]*$//' | 
    awk -F ', ' -v OFS='\n' '{ $1=$1; print }' 

這產生具有單個鍵值對的行。

現在管上面通過另一個AWK階段,使用關聯數組總結值每個鍵:

awk -F ': ' ' 
    { 
    sum[$1] += $2 
    } 
    END { 
    for (k in sum) { 
     printf("%s: %d, ", k, sum[k]) 
    } 
    printf("\n") 
    }' 

我還沒有做什麼特別的與輸出的格式,而不是僅僅印刷以任意順序迭代他們的鍵。如果您需要更具體的內容,請修改END操作。