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

AWK-使用数组按小时计数和唯一值,awk,gawk,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 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
#/usr/bin/gawk-f
{#中期开始
key=$1#共提取10条消息
key2=substr($3,1,2)#小时
消息类型[键]++#不同消息
小时[键2]++
HT_AR[key2]+=2美元——按小时计算每条消息的总数
}#中期结束
结束{
用于(MSG_类型中的MSG){
打印味精
打印“-------------------------------------”
n=asorti(小时,小时)

对于(i=1;i对于给定的示例,这些代码给出了您期望的输出:

 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的数组数组,您可以使实现更容易


对于给定的示例,这些代码提供了您期望的输出:

 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的数组数组,您可以使实现更容易



在显示代码的同时,您还应该提到它的逻辑。Unit1中的00、20、01和30都来自哪里?好的,我现在就更新它。您的编辑仍然无法解释这些数字来自哪里。第二次更新。不要在awk或shell中对变量名使用所有大写字母(除非导出)为了避免与内置变量发生冲突,并通过使代码看起来像是在使用内置变量而不是在使用内置变量来混淆代码。在显示代码的同时,您还应该提到它的逻辑。Unit1中的00、20、01和30都来自何方?好的,我现在将更新它。您的编辑仍然无法解释它们的位置所有这些数字都来自。第二次更新。不要在awk或shell中对变量名使用所有大写字母(除非导出)为了避免与内置变量发生冲突,并通过使代码看起来像是在使用内置变量而不是。您能否解释一下这段代码在做什么,以便我能进一步了解您是如何得到这个答案的?它使用空格或列作为分隔符,以便更容易获得我们需要的值。然后使用数组的数组,我添加了链接,如果你不了解
u[I][j]
是如何工作的,你可以阅读链接的文档。逻辑很简单,只有两个嵌套的循环和打印。当我尝试实现
u[I][j]
时,我在
[j]上遇到语法错误
部分。知道为什么吗?不知道……在我的工作中,我在
a[I]
上遇到了一个数组问题。你知道为什么吗?无论付出什么代价,这都是值得的。例如,它可以让你指定
访问数组索引的顺序,而不是“随机”(散列顺序)就像你当前的awk一样。你能解释一下这段代码在做什么吗?这样我才能进一步理解你是如何得到这个答案的?它使用空格或列作为分隔符,这样我们需要的值就更容易得到。然后使用数组数组,我添加了链接,如果你不理解
u[I][j]
工作时,您可以读取链接的文档。逻辑很简单,只有两个嵌套的for loop和print。当我尝试实现
u[I][j]
时,
[j]
部分出现语法错误。知道为什么吗?不知道……在我的工作中,
a[I]出现了数组问题
你知道为什么吗?不管付出什么代价,这都是值得的。例如,它可以让你指定
访问数组索引的顺序(i in array)
而不是像当前awk那样“随机”(散列顺序)。