Bash shell, используя AWK, чтобы сложить несколько соответствующих столбцов / полей? - PullRequest
1 голос
/ 17 декабря 2011

Хотите знать, если кто-то может указать мне правильное направление, используя сценарии оболочки bash и 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 ]

3 голосов
/ 17 декабря 2011

awk действительно прост в использовании.

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

Я думаю, вы можете сделать все остальное.Удачного кодирования!

1 голос
/ 17 декабря 2011

Если мы рассмотрим структуру данных, то можно сделать несколько выводов:

  • 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, если вам нужно что-то более конкретное.

1 голос
/ 17 декабря 2011

Будет ли это работать для вас -

Ваш файл:

[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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...