awk - 按列值分组并求和

Jun*_*aid 4 pipe ps awk

我有命令按内存使用情况列出系统进程:

ps -A --sort -rss -o comm,pmem
Run Code Online (Sandbox Code Playgroud)

其中列出了一个表格

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
Run Code Online (Sandbox Code Playgroud)

我想获得每个程序的总内存共享,而不是相同程序的每个进程。所以我可以得到像

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
Run Code Online (Sandbox Code Playgroud)

我想过使用awk,我不太了解。结束了类似的事情:

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

但它没有用。

我该如何纠正?

cuo*_*glm 10

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];
    }
  }
'
Run Code Online (Sandbox Code Playgroud)

如果要按第二个字段对输出进行排序,请尝试:

$ 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";
    }
  }
'
Run Code Online (Sandbox Code Playgroud)