统计多项数据

如下内容,第一个字段是IP,第二个字段是每个访问的uri。

  1. 1.1.1.1 /index1.html
    1.1.1.1 /index1.html
    1.1.1.1 /index2.html
    1.1.1.1 /index2.html
    1.1.1.1 /index2.html
    1.1.1.1 /index3.html
    1.1.1.2 /index1.html
    1.1.1.2 /index2.html
    1.1.1.2 /index2.html
    1.1.1.3 /index1.html
    1.1.1.3 /index1.html
    1.1.1.3 /index2.html
    1.1.1.3 /index2.html
    1.1.1.3 /index2.html
    1.1.1.3 /index3.html
    1.1.1.3 /index3.html
    1.1.1.4 /index2.html
    1.1.1.4 /index2.html

要求统计出每个ip访问的总次数,以及每个ip所访问的uri的次数。

期望的输出结果:

  1. 1.1.1.1 6 /index3.html 1
    1.1.1.1 6 /index2.html 3
    1.1.1.1 6 /index1.html 2
    1.1.1.2 3 /index2.html 2
    1.1.1.2 3 /index1.html 1
    1.1.1.3 7 /index3.html 2
    1.1.1.3 7 /index2.html 3
    1.1.1.3 7 /index1.html 2
    1.1.1.4 2 /index2.html 2

方法1,使用子数组。awk代码:

  1. awk '
    {
    a[$1][$2]++
    }
    END{
    # 遍历数组,统计每个ip的访问总数
    for(ip in a){
    for(uri in a[ip]){
    b[ip] += a[ip][uri]
    }
    }

    # 再次遍历
    for(ip in a){
    for(uri in a[ip]){
    print ip, b[ip], uri, a[ip][uri]
    }
    }
    }
    ' a.log

方法2,使用复合索引的数组。awk代码:

  1. awk '
    {
    a[$1]++
    b[$1"_"$2]++
    }
    END{
    for(i in b){
    split(i,c,"_");
    print c[1],a[c[1]],c[2],b[i]
    }
    }' a.log