与awk战斗

时间:2013-01-29 07:33:04

标签: shell awk reporting

问题:

我的文件如下,有几个数字和字符

  1. 字段:找不到IP时间69.175.54.106 = 17
  2. 字段:IP地址,
  3. 字段:国家/地区名称(US - 美国,CN - 中国等),
  4. 如果你看到下面的IP 69.175.54.106被解决了283次而不是17次,那么我想要第一个字段和匹配的第二个字段的总和,第三个字段应该作为国家名称

    17, 69.175.54.106,
    283, 69.175.54.106, US
    77, 58.77.59.10, CN
    23, 58.77.59.10, 
    

    输出应如下所示:

    300, 69.175.54.106, US
    100, 58.77.59.10, CN
    

1 个答案:

答案 0 :(得分:2)

这样的事可能适合你:

awk 'BEGIN {FS=", *"}
{sum[$2]+=$1 }
! country[$2] && $3 != "" {country[$2] = $3}
END { for ( k in sum ) { print sum[k] ", " k ", " country[k] } }' INPUTFILE

See it in action at Ideone.com

逐行

  1. BEGIN块中设置了字段分隔符(以消除不需要的空格)
  2. 为每一行添加时间到由IP
  3. 索引的数组
  4. 如果国家代码尚未存储,且第3个文件不为空,则将其存储在另一个数组中(由IP索引)
  5. 最后为每个IP打印总和,IP和国家/地区代码