У меня есть файл журнала, который я хотел бы разбить на несколько файлов.
Оглавление
*** Configuration Database
*** Logs
*** Configuration Logs
*** Query Logs
.
.
and so on
Проблема в том, что заголовки разделов снова появляются в теле документа с соответствующими данными или журналами между разделами, поэтому мне придется искать второй экземпляр каждого заголовка и копировать данные до второго экземпляра следующего заголовка.
Тело
*** Configuration Database
(Data/Logs)
*** Logs
(Data/Logs)
*** Configuration Logs
(Data/Logs)
*** Query Logs
(Data/Logs)
Я бы хотел взять файл отладочного текста, запустить скрипт против него и разбить файл на множество текстовых файлов, по одному для каждого раздела в таблице содержания, оставив оригинал нетронутым. Поэтому я бы в основном имел debug.txt, Configuration Database.txt, Logs.txt и т. д., каждый из которых содержал бы все данные в каждом разделе, вплоть до начала нового раздела. Любая помощь была бы очень кстати, так как это немного выше моего понимания :)
решение1
Попробуй это:
awk '/^[*][*][*] /{ if ($0 in seen) fname=$0; else seen[$0];} fname{print>fname}' file
Как это работает
awk неявно читает файл построчно. Для каждой прочитанной строки мы делаем следующее:
/^[*][*][*] /{ if ($0 in seen) fname=$0; else seen[$0];}
Для любой строки, которая начинается с трех звезд и пробела, мы проверяем, видели ли мы эту строку раньше. Если видели, мы устанавливаем
fname
на эту строку. В противном случае мы обновляем ассоциативный массив,seen
чтобы указать, что мы видели эту строку один раз.fname{print>fname}
Если
fname
— непустое значение, то записать текущую строку в файл с именемfname
.