我有以下输入文件:
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
此代码背后的逻辑是它获得$1
与MSG_TYPE[]
的所有唯一值。然后在for
循环中扫描并打印出每个值。小时由HOUR_AR[]
数组收集并对其进行排序,然后对MSG
for
循环的每次传递返回,希望返回该特定MSG
的所有小时数,然后它会为该小时打印一个$2
的总和 AND MSG
。
对不起,这是漫长的啰嗦。只是想提供足够的细节。非常感谢任何和所有帮助。
答案 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