awk - 그룹화 기준 및 열 값 합계

awk - 그룹화 기준 및 열 값 합계

메모리 사용량별로 시스템 프로세스를 나열하는 명령이 있습니다.

ps -A --sort -rss -o comm,pmem

비슷한 테이블이 나열되어 있습니다.

COMMAND         %MEM
firefox         28.2
chrome           5.4
compiz           4.8
atom             2.5
chrome           2.3
Xorg             2.3
skype            2.2
chrome           2.0
chrome           1.9
atom             1.9
nautilus         1.8
hud-service      1.5
evince           1.3

동일한 프로그램의 프로세스가 아닌 프로그램당 총 메모리 공유를 얻고 싶습니다. 그래서 나는 이런 결과를 얻을 수 있습니다

COMMAND         %MEM
firefox         28.2
chrome          11.6
compiz           4.8
atom             4.4
Xorg             2.3
skype            2.2
nautilus         1.8
hud-service      1.5
evince           1.3

을 사용해볼까 생각했지만 awk, 잘 이해가 되지 않습니다. 다음과 같이 끝났습니다.

ps -A --sort -rss -o comm,pmem | awk -F "\t" '
{processes[$0] += $1;}
{End
for(i in processes) {
  print i,"\t",processes[i];
}
}'

그러나 그것은 작동하지 않았습니다.

이 문제를 어떻게 해결할 수 있습니까?

답변1

processes[$0] += $1;전체 행을 고유하지 않은 연관 배열의 키로 사용합니다. $1즉, 명령 이름을 키로 사용해야 합니다 .

노력하다:

$ ps -A --sort -rss -o comm,pmem | awk '
  NR == 1 { print; next }
  { a[$1] += $2 }
  END {
    for (i in a) {
      printf "%-15s\t%s\n", i, a[i];
    }
  }
'

두 번째 필드를 기준으로 출력을 정렬하려면 다음을 시도하십시오.

$ ps -A --sort -rss -o comm,pmem | awk '
  NR == 1 { print; next }
  { a[$1] += $2 }
  END {
    for (i in a) {
      printf "%-15s\t%s\n", i, a[i] | "sort -rnk2";
    }
  }
'

답변2

cuonglm 답변은 오타를 수정하여 값을 얻습니다.증가귀하의 의견에서 요청한 대로 출력을 파이핑하여( sort -n -k 2두 번째 필드( )에서 숫자( )로 정렬), 예와 같이 print 문을 부동 소수점으로 출력하도록 변경한 후:-n-k 2

$ ps -A --sort -rss -o comm,pmem | awk '
  NR == 1 { print; next }
  { a[$1] += $2 }
  END {
    for (i in a) {
      printf "%-15s\t%.1f\n", i, a[i];
    }
  }
' | sed 's/%MEM/-1MEM/' | sort -n -k 2 | sed 's/-1MEM/%MEM/'

출력(테이블을 입력으로 사용하고 ps시스템에서 실행하지 않음):

COMMAND         %MEM
evince          1.3
hud-service     1.5
nautilus        1.8
skype           2.2
Xorg            2.3
atom            4.4
compiz          4.8
chrome          11.6
firefox         28.2

또는 이 Python 프로그램을 통해 출력을 파이프할 수 있습니다(예제와 같이 내림차순을 원하는 경우 다음 reverse=False과 같이 변경) reverse=True.

#! /usr/bin/env python
# coding: utf-8

import sys
import operator

d = {}
for line in sys.stdin:
    try:
        name, val = line.split()
        val = float(val)
        d.setdefault(name, [0.0])[0] += val
    except ValueError:
        print line,

for x in sorted(d.items(), reverse=False, key=operator.itemgetter(1)):
    print "{:16s}{:>4}".format(x[0], x[1][0])

관련 정보