我有两个输入文件。一个在每一行中都有名单、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)、初始时间、结束时间、持续时间和主机名的信息. 我想要实现的是输出一个以每个月为标题的文件(例如:[April]),然后计算每个登录主机的用户的持续时间。他们可能有多次登录,因此他们的名字与每行中的其他信息一起出现多次。我生成了这个文件,其中包含过去半年登录的所有用户名。我正在尝试生成以每个月份名称为标题的输出文件,并按月分组,然后将文件中的名称与我生成的名称列表进行匹配,以计算它们的持续时间并将其打印到同一行的输出文件中他们的名字印出来了。我已经想出了如何进行计算。所以现在让我感到困惑的是如何执行匹配名称的步骤
输入文件:
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
我花了很多时间试图找出它们不同的原因,但我做不到。抱歉,希望这有帮助。
关于linux - 使用 shell 遍历文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38534945/