假设一个文件包含一群用户的登录数据:
bobby activityname 2014-05-12([email protected])
bill activityname 2014-06-12([email protected])
bobby activityname 2014-06-12([email protected])
如何制作一个脚本来制作一个显示人员姓名和他们登录的不同日期的 cew 文件?
bill
2014-06-12
bobby
2014-05-12
2014-06-12
答案1
$ awk -F'[ (]' '{a[$1]=a[$1] $3 "\n"} END{for (name in a)print name "\n" a[name]}' loginFile
bobby
2014-05-12
2014-06-12
bill
2014-06-12
怎么运行的
-F'[ (]'
这告诉
awk
我们接受空格或左括号作为字段分隔符。a[$1]=a[$1] $3 "\n"
这将每个用户的登录日期存储在一个数组中
a
。END{for (name in a)print name "\n" a[name]}
当我们读完文件后,就会打印出收集到的数据。
将输出保存到文件
要将输出保存到文件,可以使用 shell重定向。因此:
awk -F'[ (]' '{a[$1]=a[$1] $3 "\n"} END{for (name in a)print name "\n" a[name]}' loginFile >newFile
处理日期和一次
假设输入文件如下所示:
$ cat loginFile2
bobby activityname 2014-05-12 15:20([email protected])
要获取日期和时间,请运行:
$ awk -F'[ (]' '{a[$1]=a[$1] $3 " " $4 "\n"} END{for (name in a)print name "\n" a[name]}' loginFile2
bobby
2014-05-12 15:20
处理多个空格
上面的例子都有单个空格。如果项目之间可能有一个或多个空格,则对于带有日期的文件和时间、用途:
awk -F' *[ (]' '{a[$1]=a[$1] $3 " " $4 "\n"} END{for (name in a)print name "\n" a[name]}' loginFile
答案2
这是通过 python 实现的。
import sys
import re
from collections import defaultdict
file = sys.argv[1]
f = open(file, 'r')
m = re.findall(r'(?m)^(\S+).*?\b(\d{4}-\d{2}-\d{2})(?=\()', f.read())
d = defaultdict(list)
for k, v in m:
d[k].append(v)
result = dict(d.items())
for i in result:
print(i)
print('\n'.join([x for x in result[i]]))
print('\n', end = "")
将上述脚本保存到文件中,然后script.py
通过在终端上触发以下命令来针对输入文件运行脚本。
python3 script.py inputfile