用于搜索并将结果导出到 .csv 文件的 Python 脚本

标签 python search csv grep

我正在尝试在 Python 中执行以下操作,还使用一些 bash 脚本。除非Python中有更简单的方法。

我有一个日志文件,其中的数据如下所示:

16:14:59.027003 - WARN - Cancel Latency: 100ms - OrderId: 311yrsbj - On Venue: ABCD
16:14:59.027010 - WARN - Ack Latency: 25ms - OrderId: 311yrsbl - On Venue: EFGH
16:14:59.027201 - WARN - Ack Latency: 22ms - OrderId: 311yrsbn - On Venue: IJKL
16:14:59.027235 - WARN - Cancel Latency: 137ms - OrderId: 311yrsbp - On Venue: MNOP
16:14:59.027256 - WARN - Cancel Latency: 220ms - OrderId: 311yrsbr - On Venue: QRST
16:14:59.027293 - WARN - Ack Latency: 142ms - OrderId: 311yrsbt - On Venue: UVWX
16:14:59.027329 - WARN - Cancel Latency: 134ms - OrderId: 311yrsbv - On Venue: YZ  
16:14:59.027359 - WARN - Ack Latency: 75ms - OrderId: 311yrsbx - On Venue: ABCD
16:14:59.027401 - WARN - Cancel Latency: 66ms - OrderId: 311yrsbz - On Venue: ABCD
16:14:59.027426 - WARN - Cancel Latency: 212ms - OrderId: 311yrsc1 - On Venue: EFGH
16:14:59.027470 - WARN - Cancel Latency: 89ms - OrderId: 311yrsf7 - On Venue: IJKL  
16:14:59.027495 - WARN - Cancel Latency: 97ms - OrderId: 311yrsay - On Venue: IJKL

我需要从每行中提取最后一个条目,然后使用每个唯一的条目并搜索出现在其中的每一行并将其导出到 .csv 文件。

我使用以下 bash 脚本来获取每个唯一的条目: cat LogFile_日期 +%Y%m%d.msg.log | awk '{print $14}' |排序|优衣库

根据日志文件中的上述数据,bash 脚本将返回以下结果:

ABCD
EFGH
IJKL
MNOP
QRST
UVWX
YZ

现在我想在同一日志文件中搜索(或 grep)每个结果并返回前十个结果。我有另一个 bash 脚本来执行此操作,但是,如何使用 FOR 循环执行此操作?因此,对于 x,其中 x = 上面的每个条目,

grep x LogFile_日期 +%Y%m%d.msg.log | awk '{print $7}' |排序-nr |优衣库 |头-10

然后将结果返回到 .csv 文件中。结果如下所示(每个字段位于单独的列中):

Column-A  Column-B  Column-C  Column-D  
ABCD        2sxrb6ab    Cancel    46ms  
ABCD      2sxrb6af  Cancel    45ms  
ABCD      2sxrb6i2  Cancel    63ms  
ABCD      2sxrb6i3  Cancel    103ms  
EFGH      2sxrb6i4  Cancel    60ms  
EFGH      2sxrb6i7  Cancel    60ms  
IJKL      2sxrb6ie  Ack       74ms  
IJKL      2sxrb6if  Ack       74ms  
IJKL      2sxrb76s  Cancel    46ms  
MNOP      vcxrqrs5  Cancel    7651ms  

我是 Python 初学者,自从大学(13 年前)以来就没有做过太多编码。任何帮助将不胜感激。谢谢。

最佳答案

假设您已打开文件。你想要做的是记录每个单独的条目在那里出现了多少次,也就是说,每个条目都会导致一次或多次计时:

from collections import defaultdict

entries = defaultdict(list)
for line in your_file:
    # Parse the line and return the 'ABCD' part and time
    column_a, timing = parse(line)
    entries[column_a].append(timing)

完成后,你就会得到一个像这样的字典:

{ 'ABCD': ['30ms', '25ms', '12ms'],
  'EFGH': ['12ms'],
  'IJKL': ['2ms', '14ms'] }

您现在要做的就是将此字典转换为另一个按其值的 len 排序的数据结构(这是一个列表)。示例:

In [15]: sorted(((k, v) for k, v in entries.items()), 
                key=lambda i: len(i[1]), reverse=True)
Out[15]: 
[('ABCD', ['30ms', '25ms', '12ms']),
 ('IJKL', ['2ms', '14ms']),
 ('EFGH', ['12ms'])]

当然,这只是说明性的,您可能希望在原始 for 循环中收集更多数据。

关于用于搜索并将结果导出到 .csv 文件的 Python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15758828/

相关文章:

python - 谷歌应用引擎: filter by ID

python 错误 - unboundLocalError

java - Python 框架作为 "Java + OSGi"组合的替代品

linux - 使用 mac 终端或脚本搜索 linux 日志文件

php - PostgreSql PHP 查询 #1 : SQLSTATE[42601]: Syntax error:

Java 将新列附加到 csv 文件

python - 如何从 pandas 数据框中清除前缀?

python - 如何在考虑到特定约束的情况下搜索嵌套字典

python - 如何修复 Twitter 30 天沙盒搜索上的错误代码 403?

php - 将 php 数组转换为 csv 字符串