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];
    }
  }
'

2番目のフィールドに基づいて出力をソートするには、次のようにします。

$ 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";
    }
  }
'

おすすめ記事