根据行的内容隔行扫描来自多个文件的文本
Interlacing text from multiple files based on contents of line
我正在尝试获取 N 个文件,顺便说一下,这些文件都是 syslog 日志文件,并根据作为该行第一部分的时间戳将它们交织在一起。我可以天真地做到这一点,但我担心我的方法只能适用于其中的少数几个文件。
假设我只有两个文件,1.log
和 2.log
。 1.log
看起来像这样:
2016-04-06T21:13:23.655446+00:00 foo 1
2016-04-06T21:13:24.384521+00:00 bar 1
和 2.log
看起来像这样:
2016-04-06T21:13:24.372946+00:00 foo 2
2016-04-06T21:13:24.373171+00:00 bar 2
鉴于该示例,我希望输出为:
2016-04-06T21:13:23.655446+00:00 foo 1
2016-04-06T21:13:24.372946+00:00 foo 2
2016-04-06T21:13:24.373171+00:00 bar 2
2016-04-06T21:13:24.384521+00:00 bar 1
因为这将是文件的行,按每行开始的时间戳组合和排序。
我们可以假设每个文件在程序 运行 之前都是内部排序的。 (如果不是,rsyslog 和我有话要说。)
很天真我可以写这样的东西,忽略内存问题和诸如此类的东西:
interlaced_lines = []
first_lines = [[f.readline(), f] for f in files]
while first_lines:
first_lines.sort()
oldest_line, f = first_lines[0]
while oldest_line and (len(first_lines) == 1 or (first_lines[1][0] and oldest_line < first_lines[1][0])):
interlaced_lines.append(oldest_line)
oldest_line = f.readline()
if oldest_line:
first_lines[0][0] = oldest_line
else:
first_lines = first_lines[1:]
我担心这可能会很慢,像这样逐行阅读。但是,我不确定该怎么做。我可以使用不同的算法或通过并行化更快地执行此任务吗?我对使用哪种语言和工具基本上无动于衷。
事实证明,由于每个文件都在内部进行了预排序,我可以用 sort --merge
走得更远。对于超过 2GB 的日志,它在 15 秒内对它们进行了排序。使用我的示例:
% sort --merge 1.log 2.log
2016-04-06T21:13:23.655446+00:00 foo 1
2016-04-06T21:13:24.372946+00:00 foo 2
2016-04-06T21:13:24.373171+00:00 bar 2
2016-04-06T21:13:24.384521+00:00 bar 1
我正在尝试获取 N 个文件,顺便说一下,这些文件都是 syslog 日志文件,并根据作为该行第一部分的时间戳将它们交织在一起。我可以天真地做到这一点,但我担心我的方法只能适用于其中的少数几个文件。
假设我只有两个文件,1.log
和 2.log
。 1.log
看起来像这样:
2016-04-06T21:13:23.655446+00:00 foo 1
2016-04-06T21:13:24.384521+00:00 bar 1
和 2.log
看起来像这样:
2016-04-06T21:13:24.372946+00:00 foo 2
2016-04-06T21:13:24.373171+00:00 bar 2
鉴于该示例,我希望输出为:
2016-04-06T21:13:23.655446+00:00 foo 1
2016-04-06T21:13:24.372946+00:00 foo 2
2016-04-06T21:13:24.373171+00:00 bar 2
2016-04-06T21:13:24.384521+00:00 bar 1
因为这将是文件的行,按每行开始的时间戳组合和排序。
我们可以假设每个文件在程序 运行 之前都是内部排序的。 (如果不是,rsyslog 和我有话要说。)
很天真我可以写这样的东西,忽略内存问题和诸如此类的东西:
interlaced_lines = []
first_lines = [[f.readline(), f] for f in files]
while first_lines:
first_lines.sort()
oldest_line, f = first_lines[0]
while oldest_line and (len(first_lines) == 1 or (first_lines[1][0] and oldest_line < first_lines[1][0])):
interlaced_lines.append(oldest_line)
oldest_line = f.readline()
if oldest_line:
first_lines[0][0] = oldest_line
else:
first_lines = first_lines[1:]
我担心这可能会很慢,像这样逐行阅读。但是,我不确定该怎么做。我可以使用不同的算法或通过并行化更快地执行此任务吗?我对使用哪种语言和工具基本上无动于衷。
事实证明,由于每个文件都在内部进行了预排序,我可以用 sort --merge
走得更远。对于超过 2GB 的日志,它在 15 秒内对它们进行了排序。使用我的示例:
% sort --merge 1.log 2.log
2016-04-06T21:13:23.655446+00:00 foo 1
2016-04-06T21:13:24.372946+00:00 foo 2
2016-04-06T21:13:24.373171+00:00 bar 2
2016-04-06T21:13:24.384521+00:00 bar 1