【问题标题】:AWK get avarage value with group by 2 fields [closed]AWK通过2个字段获得平均值[关闭]
【发布时间】:2019-03-08 09:48:32
【问题描述】:

我找到了如何按 PID 获取汇总值分组列:

iotop -botqqqk -n 10 |  awk '{print $13,$2,$5}'| sort -rnk 1  | awk '                         
  { a[$2] += $3 }
  END {
    for (i in a) {
      printf "top_10_read{pid=\"%s\",name=\"%s\"} %s\n", i, $1, a[i] | "sort -rnk2";
    }
  }               
'

但我需要按 PID 和 PROCESS NAME 对它进行分组的排序平均值“DISK READ”。

我找到了现成的解决方案:https://github.com/ncabatoff/process-exporter/。 但我认为它没有足够的细节。我已经有一些“杂乱”的脚本来导出有关进程的信息:

echo "TOP 10 CPU"
ps -A -rss -o comm,pcpu | awk -v cpus="$(nproc --all)" '
  { a[$1] += $2 }
  END {
    for (i in a) {
      printf "top_10_cpu{process=\"%s\"} %s\n", i, a[i]/cpus | "sort -rnk2";
    }
  }               
' | head -n 10

echo "TOP 10 RAM"
ps -A -rss -o comm,pmem | awk '                         
  { a[$1] += $2 }
  END {
    for (i in a) {
      printf "top_10_ram{process=\"%s\"} %s\n", i, a[i] | "sort -rnk2";
    }
  }               
' | head -n 10

echo "TOP 10 RSS"
ps -A -o comm,rss | awk '
  { a[$1] += $2 }
  END {
    for (i in a) {
      printf "top_10_rss{process=\"%s\"} %s\n", i, a[i]/1024 | "sort -g -rk2,2";
    }
  }
' | head -n 10

echo "TOP 10 VSZ"
ps -A -o comm,vsz | awk '
  { a[$1] += $2 }
  END {
    for (i in a) {
      printf "top_10_vsz{process=\"%s\"} %s\n", i, a[i]/1024 | "sort -g -rk2,2";
    }
  }
' | head -n 10

echo "TOP 10 SZ"
 ps -A -o comm,sz | awk '
  { a[$1] += $2 }
  END {
    for (i in a) {
      printf "top_10_sz{process=\"%s\"} %s\n", i, a[i]/1024 | "sort -g -rk2,2";
    }
  }
' | head -n 10

而且还会通过每个进程获取有关 TCP 连接状态的信息。

您认为这是一种切割器解决方案,还是我只是浪费时间而有一些现成的选择?

输入示例:

 #iotop -botqqqk -n 10 |  awk '{print $13,$2,$5}'| sort -rnk 1
    glusterfsd 23976 0.00
    glusterfsd 23976 0.00
    glusterfsd 23975 122.89
    glusterfsd 23975 116.36

预期输出示例:

    glusterfsd 23976 0.00
    glusterfsd 23975 119.625

其中 PID 23975 的平均磁盘读取值为“119.625”。

问候

【问题讨论】:

  • 请使用代码标签发布输入示例和预期输出示例,以便更好地理解问题。
  • 当我听到“按字段分组”并统计平均值之类的数据时,我认为 GNU datamash 是首选工具。
  • 为什么要寻找更好的解决方案?并请定义“混乱”——据我所知,这些是针对不同用例的好解决方案。那么您打算优化哪个用例?
  • > 请张贴带有代码标签的输入示例和预期输出示例,以便更好地理解问题。 更新帖子。谢谢。
  • >当我听到“按字段分组”并统计平均值之类的东西时,我认为 GNU datamash 是首选工具 谢谢,我一定会试试这个

标签: bash awk metrics


【解决方案1】:

第一种解决方案:请您尝试以下方法。

your_comand | awk '{a[$1,$2]++;b[$1,$2]+=$NF} END{for(i in a){print i,b[i]/a[i]}}' 


第二个解决方案:如果您想以 Input_file 的第一个和第二个字段顺序相同的顺序打印输出,请尝试以下操作。

your_command | awk 'BEGIN{SUBSEP=" "} !c[$1,$2]++{d[++count]=$1 OFS $2} {a[$1,$2]++;b[$1,$2]+=$NF} END{for(i=1;i<=count;i++){print d[i],b[d[i]]/a[d[i]]}}' 


编辑: 通过查看 OP 尝试在单个 awk 本身内执行此操作的代码,尽管根本没有经过测试(因为命令 iotop -botqqqk -n 10 的示例输出不是提供)。

iotop -botqqqk -n 10 | awk 'BEGIN{SUBSEP=" "} !c[$13,$2]++{d[++count]=$13 OFS $2} {a[$13,$2]++;b[$13,$2]+=$5} END{for(i=1;i<=count;i++){print d[i],b[d[i]]/a[d[i]]}}'

【讨论】:

  • @gremlintv2,请您检查一下并告诉我好吗?
  • 抱歉耽搁了,谢谢你最火的解决方案很有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多