AWK - 使用数组按小时和唯一值计数
AWK - Using arrays to count by hour and unique value
我有以下输入文件:
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
有关此输入文件的一些背景信息。这是我负责分析的电子门户的工作单元列表。在日志文件中,它提供了单元名称 (</code>) 以及学生在点击提交之前完成的问题总数 (<code>
),它记录了时间 (</code>) ,进行了调整以提供更清晰的示例。</p>
<p>我想输出以下内容:</p>
<pre><code>Unit1
---------------------
00
========
20
--------
01
========
30
--------
Unit2
---------------------
00
========
5
--------
01
========
5
--------
Unit3
---------------------
00
========
30
--------
我目前的代码如下:
#!/usr/bin/gawk -f
{ #Start of MID
key = #Message Extracted 10 Total
key2 = substr(,1,2) #Hour
MSG_TYPE[key]++ #Distinct Message
HOUR_AR[key2]++
HT_AR[key2] += #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
此代码背后的逻辑是它从 </code> 和 <code>MSG_TYPE[]
获取所有唯一值。然后在 for
循环中扫描并打印出每个值。小时由 HOUR_AR[]
数组收集并排序,然后对于 MSG
for
循环的每次传递 returns,希望是特定 [=20] 的所有小时=] 然后它打印那个小时 AND MSG
的总和
。
对不起,这是啰嗦。只是想提供足够的细节。非常感谢任何帮助。
对于给定的示例,此代码给出了您预期的输出:
awk -F'[ :]+' '{u[][]+=}
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的array of array,你可以使实现更容易。
https://www.gnu.org/software/gawk/manual/html_node/Arrays-of-Arrays.html#Arrays-of-Arrays
我有以下输入文件:
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
有关此输入文件的一些背景信息。这是我负责分析的电子门户的工作单元列表。在日志文件中,它提供了单元名称 (</code>) 以及学生在点击提交之前完成的问题总数 (<code>
),它记录了时间 (</code>) ,进行了调整以提供更清晰的示例。</p>
<p>我想输出以下内容:</p>
<pre><code>Unit1
---------------------
00
========
20
--------
01
========
30
--------
Unit2
---------------------
00
========
5
--------
01
========
5
--------
Unit3
---------------------
00
========
30
--------
我目前的代码如下:
#!/usr/bin/gawk -f
{ #Start of MID
key = #Message Extracted 10 Total
key2 = substr(,1,2) #Hour
MSG_TYPE[key]++ #Distinct Message
HOUR_AR[key2]++
HT_AR[key2] += #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
此代码背后的逻辑是它从 </code> 和 <code>MSG_TYPE[]
获取所有唯一值。然后在 for
循环中扫描并打印出每个值。小时由 HOUR_AR[]
数组收集并排序,然后对于 MSG
for
循环的每次传递 returns,希望是特定 [=20] 的所有小时=] 然后它打印那个小时 AND MSG
的总和 。
对不起,这是啰嗦。只是想提供足够的细节。非常感谢任何帮助。
对于给定的示例,此代码给出了您预期的输出:
awk -F'[ :]+' '{u[][]+=}
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的array of array,你可以使实现更容易。
https://www.gnu.org/software/gawk/manual/html_node/Arrays-of-Arrays.html#Arrays-of-Arrays