【问题标题】:How do I count number of instances of an output in awk?如何计算 awk 中输出的实例数?
【发布时间】:2012-12-15 05:07:59
【问题描述】:

TL;DR

想法是:

awk '{
    IP[$1]++;
  }
  END {
    for(var in IP) 
      print IP[var]
  }
}' getline < sockstat | awk '{print $2 "@" $3}' | grep -v '^PROCESS@PID'

我想计算输出中每个块的实例数 -> 袜子统计 | awk '{打印 $2 "@" $3}' | grep -v '^PROCESS@PID'

看起来像:

ubuntu-geoip-pr@2382
chrome@2453
chrome@2453
chrome@2453
chrome@2453
chrome@2453
chrome@2453
chrome@2453
chrome@2453
rhythmbox@4759
rhythmbox@4759
rhythmbox@4759

最后,我想得到如下输出:

1
8
3

这对应于上一个输出中每个项目的出现次数。

完整的问题:

sockstat 命令输出 localhost 的一些网络统计信息。我首先从输出的第二列和第三列(分别为 PROCESS 和 PID)打印出一个键,格式为 PROCESS@PID。然后,我想从该输出中计算每个唯一键的频率。一种方法是使用 awk getline 结构,但这似乎适用于文件,我无法让它直接从上述命令中提取输入。

我不想使用临时文件,因为这会带走解决方案的优雅。

【问题讨论】:

  • 如果您提供像getline 这样的文件名,awk 将不会读取其标准输入(文件sockstat)。第一个脚本中存在区分大小写的问题(Ip 出现两次,IP 出现一次)。由于第一个脚本的输出是一个字段,第二个awk 脚本不能读取字段 2 和 3。输出中的“块”是什么?您的数据实际上是什么样的?你期望输出什么?
  • 修复了这个问题。错字,我的错。
  • uniq -c 在这里不是更好的解决方案吗?
  • 你好先生,刚刚解决了整个问题。我不知道uniq 接受了争论。将其添加为文档的答案。

标签: linux bash awk


【解决方案1】:
sockstat | awk '{print $2 "@" $3}' | grep -v '^PROCESS@PID' | sort | uniq -c | awk '{print $1}'

【讨论】:

  • uniq -c的输入必须排序;目前尚不清楚那里的输入是否已排序。
【解决方案2】:

这个怎么样?

sockstat | grep -v PROCESS | awk '{key=$2"@"$3; count[key]++} END {for ( key in count ) { print key" "count[key]; } }'

【讨论】:

    【解决方案3】:

    你可以简化你的命令:

    sockstat | awk 'NR>1 { a[$2 "@" $3]++ } END { for (i in a) print a[i], i }'
    

    如果您只需要计数,只需编辑打印语句:

    sockstat | awk 'NR>1 { a[$2 "@" $3]++ } END { for (i in a) print a[i] }'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 2018-10-06
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多