AWK - 使用数组按小时和唯一值计数

时间:2016-06-23 08:16:40

标签: awk gawk

我有以下输入文件:

Unit1 15 00:20:58
Unit1 30 01:10:00
Unit3 10 00:20:15
Unit2 5  00:45:00
Unit3 20 00:30:00
Unit2 2  01:22:35
Unit2 3  01:35:22
Unit1 5  00:58:20

对于此输入文件的某些背景信息。它是我负责分析的电子门户的工作单元列表。在日志文件中,它提供单位名称($1)以及学生在点击提交之前完成的问题总数($2),记录时间($3) ,调整以允许更清晰的例子。

我想输出以下内容:

Unit1
---------------------
00
========
20
--------
01 
========
30
--------

Unit2
---------------------
00
========
5
--------
01 
========
5
--------

Unit3
---------------------
00
========
30
--------

我目前的代码如下:

#!/usr/bin/gawk -f

{ #Start of MID
        key = $1 #Message Extracted 10 Total
        key2 = substr($3,1,2) #Hour
        MSG_TYPE[key]++ #Distinct Message
        HOUR_AR[key2]++
        HT_AR[key2] += $2 #Tots up the total for each message by hour

} #End of MID
END {
                for (MSG in MSG_TYPE) {
                        print MSG
                        print "-----------------------------------"
                n=asorti(HOUR_AR, HOUR_SOR)
                for (i = 1; i <= n; i++) {
                            print HOUR_SOR[i]
                            print "========="
                            print HOUR_AR[HOUR_SOR[i]]
                            print "---------"
                            }
                            print "\n"
                    }
    } #End of END

此代码背后的逻辑是它获得$1MSG_TYPE[]的所有唯一值。然后在for循环中扫描并打印出每个值。小时由HOUR_AR[]数组收集并对其进行排序,然后对MSG for循环的每次传递返回,希望返回该特定MSG的所有小时数,然后它会为该小时打印一个$2的总和 AND MSG

对不起,这是漫长的啰嗦。只是想提供足够的细节。非常感谢任何和所有帮助。

1 个答案:

答案 0 :(得分:2)

对于给定的示例,此代码按预期提供输出:

 awk -F'[ :]+' '{u[$1][$3]+=$2}
     END{for(i in u){
            print i;print "--------";
            for(j in u[i])
               print j"\n====\n"u[i][j]"\n---"}}' file

输出:

Unit1
--------
00
====
20
---
01
====
30
---
Unit2
--------
00
====
5
---
01
====
5
---
Unit3
--------
00
====
30
---

请注意,排序部分未在代码中完成。但是你明白了,如果使用gnu awk的数组数组,你可以更容易实现。

https://www.gnu.org/software/gawk/manual/html_node/Arrays-of-Arrays.html#Arrays-of-Arrays