Объединение файлов журнала с фрагментами с метками времени - PullRequest
0 голосов
/ 26 августа 2018

Если каждая строка начинается со времени, объединить строки и затем отсортировать несложно.Я пытаюсь объединить десятилетия логов чата, которые в противном случае представляют собой простой текст, разделенный в начале и в конце метками времени.Каждый файл имеет несколько из этих разделов.

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

Существует несколько файлов для каждого человека, представляющих перекрывающиеся блоки времени.Если у одного файла есть сессии в ноябре и январе, у другого могут быть сессии в декабре и феврале.Я хотел бы объединить их все в один хронологический файл.

Еще больше усложняет то, что иногда нет закрытия сеанса из-за сбоя, а вместо этого просто еще один запуск сеанса.Предполагается, что закрытие сеанса произошло непосредственно перед этим.Если есть двусмысленность или совпадение, сценарий не должен объединять блоки.

Открыт для решений на любом языке или в среде командной строки.

1 Ответ

0 голосов
/ 05 сентября 2018

awk (gawk для GNU вкл.) Подходит для этой задачи. Основная идея - найти хороший разделитель записей и разделитель полей.
В этом случае 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

file1 :

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|
...