合并带有时间戳块的日志文件
Merge log files with timestamped chunks
如果每行都以时间开头,则合并这些行然后进行排序就很简单了。我正在尝试将数十年的聊天记录合并在一起,否则这些记录是在开始和结束时由时间戳分隔的纯文本。每个文件都有几个这样的部分。
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 月有会话。我想将它们全部合并到一个按时间顺序排列的文件中。
更复杂的是,有时由于崩溃而没有会话关闭,而只是另一个会话开始。应该暗示会话关闭就在那之前发生。如果有任何歧义或重叠,脚本不应合并块。
接受任何语言或命令行环境中的解决方案。
awk
(gawk
用于 GNU impl。)适合该任务。主要思路是找个好的Record Separator和Field Separator。
在这种情况下,RS="Session Start "
(包括结尾的 space)和 FS="\n"
。
对于输出字段分隔符 OFS,可以使用管道或其他符号。最后,输出按第一个日期字段排序。
此解决方案可能会导致排长队,但可以帮助您开始使用更好的解决方案。
#!/bin/bash
gawk 'BEGIN{ RS="Session Start " ; FS="\n"; OFS="|"} {
split(,a,": ")
# put date first on first field
=a[2] " " a[1]
print [=10=]
}' 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
file2:
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|
如果每行都以时间开头,则合并这些行然后进行排序就很简单了。我正在尝试将数十年的聊天记录合并在一起,否则这些记录是在开始和结束时由时间戳分隔的纯文本。每个文件都有几个这样的部分。
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 月有会话。我想将它们全部合并到一个按时间顺序排列的文件中。
更复杂的是,有时由于崩溃而没有会话关闭,而只是另一个会话开始。应该暗示会话关闭就在那之前发生。如果有任何歧义或重叠,脚本不应合并块。
接受任何语言或命令行环境中的解决方案。
awk
(gawk
用于 GNU impl。)适合该任务。主要思路是找个好的Record Separator和Field Separator。
在这种情况下,RS="Session Start "
(包括结尾的 space)和 FS="\n"
。
对于输出字段分隔符 OFS,可以使用管道或其他符号。最后,输出按第一个日期字段排序。
此解决方案可能会导致排长队,但可以帮助您开始使用更好的解决方案。
#!/bin/bash
gawk 'BEGIN{ RS="Session Start " ; FS="\n"; OFS="|"} {
split(,a,": ")
# put date first on first field
=a[2] " " a[1]
print [=10=]
}' 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
file2:
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|