如何运行脚本来获取文件的某些内容

如何运行脚本来获取文件的某些内容

假设一个文件包含一群用户的登录数据:

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

相关内容