使用带时间戳的块合并日志文件

问题描述 投票:0回答:1

如果每一行都以时间开始,那么合并行然后排序是微不足道的。我正在尝试将几十年的聊天记录合并在一起,这些聊天记录在开始和结束时以时间戳分隔。每个文件都有几个这样的部分。

Session Start (Bob): Sun Nov 30 19:33:38 2003
Bob: hey what's up?
Michael: oh nothing
Session Close (Bob): Mon Dec 1 02:22:18 2003

Session Start (Bob): Thu Dec 4 09:33:38 2003
Michael: long time no hear
Session Close (Bob): Thu Dec 4 13:22:18 2003

每个人有多个文件代表重叠的时间块。如果一个文件在11月和1月有会话,则另一个可能在12月和2月有会话。我想将它们全部合并为一个按时间顺序排列的文件。

更复杂的是,有时由于崩溃而没有会话关闭,而只是另一个会话开始。会话结束应该隐含在此之前发生。如果存在任何歧义或重叠,则脚本不应合并块。

在任何语言或命令行环境中开放解决方案。

logging text-processing text-parsing
1个回答
2
投票

awk(GNU impl。的gawk)适合这项任务。主要思想是找到一个好的记录分隔符和字段分隔符。 在这种情况下,RS="Session Start "(包括尾随空间)和FS="\n"。对于输出场分离器OFS,可以使用管道或其他符号。最后,输出按第一个日期字段排序。此解决方案可能会导致非常长的行,但可以帮助您开始使用更好的解决方案。

#!/bin/bash

gawk 'BEGIN{ RS="Session Start " ; FS="\n"; OFS="|"} {
split($1,a,": ")
# put date first on first field
$1=a[2] " " a[1]
print $0
}' file1.txt file2.txt | sort --field-separator="|" -k 2,2 -k 3,3 -k 5,5

菲尔1:

Session Start (Bob): Sun Nov 30 19:33:38 2003
Bob: hey what's up?
Michael: oh nothing
Session Close (Bob): Mon Dec 1 02:22:18 2003

Session Start (Bob): Thu Dec 4 09:33:38 2003
Michael: long time no hear
Session Close (Bob): Thu Dec 4 13:22:18 2003

文件2:

Session Start (Bob): Tue Dic 2 19:33:38 2003
Bob: hey what's up?
Michael: oh nothing
Session Close (Bob): Tue Dic 2 20:22:18 2003

Session Start (Bob): Wed Jan 15 09:33:38 2003
Michael: long time no hear
Session Close (Bob): Wed Jan 15 13:22:18 2003

输出:

Sun Nov 30 19:33:38 2003 (Bob)|Bob: hey what's up?|Michael: oh nothing|Session Close (Bob): Mon Dec 1 02:22:18 2003||
Tue Dec 2 19:33:38 2003 (Bob)|Bob: hey what's up?|Michael: oh nothing|Session Close (Bob): Tue Dec 2 20:22:18 2003||
Thu Dec 4 09:33:38 2003 (Bob)|Michael: long time no hear|Session Close (Bob): Thu Dec 4 13:22:18 2003|
Wed Jan 15 09:33:38 2003 (Bob)|Michael: long time no hear|Session Close (Bob): Wed Jan 15 13:22:18 2003|
© www.soinside.com 2019 - 2024. All rights reserved.