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
- $ 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
- WM6098;RXOTG-120;283;2
- WH4648;RXOTG-426;283;2
- WH5118;RXOTG-59;;
- WH6149;RXOTG-29;;
- WH4767;RXOTG-313;;
- 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的访问量。
- 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
- 00 398511
- 02 229771
- 04 168740
- 11 103090
[解析]
$6>100000作为pattern,把$5以":"为分割符拆分放入数组a中,这样做就等于说a[1]即是截取了小时,然后把a[1]作为数组b的下标,同一小时内即可进行累加。最后END对数组b里的元素进行排序,把排序后的值存入数组c中,再用for循环依次按顺序取出排序好的时间格式,再嵌套数组b中取出该时间内累加的值。
阅读(4326) | 评论(0) | 转发(0) |