Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3031760
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-05-30 13:23:30

WM6098;RXOTG-120;283
WH4648;RXOTG-426;283
WH5118;RXOTG-59;
WH6149;RXOTG-29;
WH4767;RXOTG-313;
WH4323;RXOTG-273;299
 
统计第3列的内容在全文中出现的次数,把数目再附在后面,得到下面的效果:
WM6098;RXOTG-120;283;2
WH4648;RXOTG-426;283;2
WH5118;RXOTG-59;;
WH6149;RXOTG-29;;
WH4767;RXOTG-313;;
WH4323;RXOTG-273;299;1
 
  1. $ awk -F';' '$3{a[$3]++}{b[NR]=$0;c[NR]=$3}END{for(i=1;i<=NR;i++)print b[i] FS a[c[i]]}' file
  2. WM6098;RXOTG-120;283;2
  3. WH4648;RXOTG-426;283;2
  4. WH5118;RXOTG-59;;
  5. WH6149;RXOTG-29;;
  6. WH4767;RXOTG-313;;
  7. WH4323;RXOTG-273;299;1
[解析]
  学习是个思路,首先要想好解决的思路才是最重要的。要统计$3的数目,肯定是需要 i++ 的计数概念,这是第一点。第二点,其中某几行并没有$3,它们的值也是为空的,放入数组后空值也算一个元素的,那自加一次不是有值了吗?是的,那需要对$3的存在做一个条件判断,起初我是考虑的 length($3)>0 这个pattern,后一想,既然是pattern那有值既为真,空值即为假,直接把$3作为pattern就好了。就有了对$3的数量统计:$3{a[$3]++}。
 
  最后我们需要打印全行,那肯定有个容器来放入每行的$0,即为b[NR]=$0。
 
  c[NR]=$3,为什么还有这句?这是我们本文的重点。数组a统计出来数目后,用什么方式取出数组a里的元素?for?那是随机提取的,否定。而且还要和每行的$3对应,在后面打印出它的数目。怎么办呢?这时我们还需要一个容器c来保存每一行的$3的值,作为在统计数目的数组a中的下标,这样才能相对应提取出$3的数目,这就是2个数组的嵌套使用。没明白?再想想。^_^
 
 
 
我们再看一个例子:
139.42.236.199 - - 2011-05-29 00:41:53 103090 "POST "Java/1.6.0_21"
149.42.236.203 - - 2011-05-29 00:42:53 126681 "POST "Java/1.6.0_21"
169.46.236.201 - - 2011-05-29 00:47:53 168740 "POST "Java/1.6.0_21"
179.45.236.199 - - 2011-05-29 02:41:53 103090 "POST "Java/1.6.0_21"
119.43.236.203 - - 2011-05-29 02:42:53 126681 "POST "Java/1.6.0_21"
189.42.236.201 - - 2011-05-29 04:47:53 168740 "POST "Java/1.6.0_21"
149.42.236.199 - - 2011-05-29 11:41:53 103090 "POST "Java/1.6.0_21"
这是一个简单的日志log,要求统计每小时$6>100000的访问量。

 

  1. awk '$6>100000{split($5,a,":");b[a[1]]+=$6}END{l=asorti(b,c);for(i=1;i<=l;i++)print c[i],b[c[i]]}' file
  2. 00 398511
  3. 02 229771
  4. 04 168740
  5. 11 103090

[解析]

  $6>100000作为pattern,把$5以":"为分割符拆分放入数组a中,这样做就等于说a[1]即是截取了小时,然后把a[1]作为数组b的下标,同一小时内即可进行累加。最后END对数组b里的元素进行排序,把排序后的值存入数组c中,再用for循环依次按顺序取出排序好的时间格式,再嵌套数组b中取出该时间内累加的值。

 
阅读(4326) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~