Bash shell使用AWK添加几个相应的列/字段?

时间:2011-12-17 09:10:53

标签: bash awk

想知道是否有人可以使用bash shell脚本指向正确的方向,并使用awk添加多个列/字段并打印出摘要。

我想采用以下格式输出的统计数据

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

感谢

3 个答案:

答案 0 :(得分:3)

awk非常易于使用。

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

我认为你可以做其余的事情。快乐的编码!

答案 1 :(得分: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

答案 2 :(得分: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操作。