我有两个输入文件。每行都有名单、mm:dd 形式、使用持续时间和其他主机名内容。另一个是我生成的,每行都有一组不重复的名单。
我正在尝试编写一个 shell 命令来遍历带有名单的文件,将它们存储为变量并检查其他文件以匹配名称,然后输出每个人的总使用持续时间,然后输出一个包含和信息。无论如何我可以使用 awk 或其他东西来完成这项工作吗?
我想到了命令:
对于 $(cat namelist) 中的单词;执行 echo $word;完毕
但这仅适用于迭代一个文件。
我想做的是这样的:
for word in namelist.txt:
for words in info_file.txt (field $1):
if word == words:
(calculating usage of time)
print(word, ':', usage of time)
我已经弄清楚了计算时间使用情况的代码。我现在的问题是如何进行这个操作。
有人可以帮忙吗?
-----------------进一步说明
所以我有一个文件,其中包含用户登录主机所花费的时间信息,每一行都有名称、日期(mm:dd:hh:mm)、初始时间、结束时间、持续时间和主机名信息。
我想要实现的是输出一个以每月为标题的文件(例如:[四月]),然后计算每个登录主机的用户的持续时间。他们可能有多次登录,因此他们的名字与每行中的其他信息一起出现多次。我生成了这个文件,其中包含过去半年内登录的所有用户名。我正在尝试生成以每个月份名称作为标题的输出文件,并按月份分组,然后将文件中的名称与我生成的名单进行匹配,以计算其持续时间并将其打印到同一行的输出文件中印有他们的名字。我已经弄清楚如何进行计算了。所以现在让我困惑的是如何执行匹配名称的步骤
输入文件:
sdou pts/11 Thu Dec 10 05:24 - 12:11 (2+06:46) 131.243.186.99
sdou pts/10 Thu Dec 10 05:04 - 12:11 (2+07:06) 131.243.186.99
sdou pts/9 Thu Dec 10 03:26 - 12:11 (2+08:45) 131.243.186.99
ermartin pts/0 Sat Dec 12 12:37 - 13:44 (01:06) c-24-130-14-154.hsd1.ca.comcast.net
ermartin pts/0 Sat Dec 12 12:18 - 12:31 (00:13) c-24-130-14-154.hsd1.ca.comcast.net
示例输出:
[Dec]
sdou 94.xxxhours
ermartin 1.19hours
我认为这就是你想要的(使用 GNU awk 4.* 来实现真正的多维数组):
$ cat tst.awk
{
n = split($9,t,/[()+:]/)
hours = t[n-3]*24 + t[n-2] + t[n-1]/60
tot[$4][$1] += hours
}
END {
for (month in tot) {
print "["month"]"
for (user in tot[month]) {
print user, tot[month][user] "hours"
}
}
}
$ awk -f tst.awk file
[Dec]
sdou 166.617hours
ermartin 1.31667hours
但输出数字与您的预期值不匹配:
[Dec]
sdou 94.xxxhours
ermartin 1.19hours
我花了很多时间试图找出它们不同的原因,但我做不到。抱歉,无论如何希望这会有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)