2017-02-03 6 views
0

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

Введите текст

Header| Header Identifier 
[2017-02-03 14:23:44,066] - Message 1 
[2017-02-03 14:23:45,066] - Message 1 
[2017-02-03 14:23:46,066] - Message 1 
[2017-02-03 14:23:47,066] - Message 1 
Trailer | Trailer Identifer 
Header| Header Identifier 
[2017-02-03 14:23:44,066] - Message 2 
[2017-02-03 14:23:45,066] - Message 2 
[2017-02-03 14:23:46,066] - Message 2 
[2017-02-03 14:23:47,066] - Message 2 
Trailer | Trailer Identifer 

Вывод Я пытаюсь создать

Header| Header Identifier 
[2017-02-03 14:23:44,066] - Message 1 
Trailer | Trailer Identifer 
Header| Header Identifier 
[2017-02-03 14:23:44,066] - Message 2 
Trailer | Trailer Identifer 

Заранее спасибо!

Обновление: я не пытаюсь удалить дубликаты здесь, я хочу сохранить запись с самой низкой меткой времени и удалить другие.

+0

Что-то вроде 'awk '! A [$ 0] ++' файл' должен работать (вам придется играть с разделителями полей). Этот вопрос довольно распространен для bash, но я не могу найти точный дубликат. – Aserre

+0

@Aserre: на втором взгляде это не похоже на дубликат того, который вы опубликовали. OP хочет переупорядочить входной файл для показанного вывода. Я предполагаю, вывод будет переформатирован несколькими строками. – Inian

+0

@ Иниан. Да, я не заметил, что временная метка не была точно идентичной во входе OP. Кроме того, если сообщение 1 и сообщение 2 не уникальны, нужно будет обрабатывать сообщения журнала в соответствии с блоками «Заголовок/трейлер». – Aserre

ответ

2

Для этого есть команда bash: uniq. Введите эту команду:

uniq -f3 file 

Вам повезло, команда по-прежнему работает с прецедентом, нет необходимости программировать с AWK. Я цитирую некоторую часть страницы руководства:

uniq фильтры смежные соответствующие линии от INPUT (или стандартного ввода), записывающие на OUTPUT (или стандартный вывод).

Опция -f3 позволяет избежать сравнения первых трех полей.

+0

Спасибо большое! ты спас мой день. Он работает отлично. Поскольку я новичок здесь, я не могу поддержать этот ответ. –

0

@Abhishek Нараяно: Попытка:

awk --re-interval '/[0-9]{4}-[0-9]{2}-[0-9]{2}/ && !Q{print;Q=1;next} !/[0-9]{4}-[0-9]{2}-[0-9]{2}/{Q="";print}' Input_file 

Учитывая, что ваш входной файл имеет упорядоченные даты. Я проверяю регулярное выражение на дату, затем проверяю, является ли переменная с именем Q равным нулю, печатает строку и устанавливает значение Q на 1. Таким образом, когда строка не соответствует шаблону даты, она устанавливает значение переменной Q в значение null и печатает линия.