根据行的内容隔行扫描来自多个文件的文本

Interlacing text from multiple files based on contents of line

我正在尝试获取 N 个文件,顺便说一下,这些文件都是 syslog 日志文件,并根据作为该行第一部分的时间戳将它们交织在一起。我可以天真地做到这一点,但我担心我的方法只能适用于其中的少数几个文件。

假设我只有两个文件,1.log2.log1.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