Удалить повторяющиеся строки из файла, который содержит метку времени


8

Этот вопрос / ответ имеет несколько хороших решений для удаления идентичных строк в файле, но не будет работать в моем случае, так как в противном случае дублирующиеся строки имеют временную метку.

Можно ли сказать awk игнорировать первые 26 символов строки при определении дубликатов?

Пример:

[Fri Oct 31 20:27:05 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:10 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:13 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:16 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:21 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:22 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:23 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:24 2014] The Brown Cow Jumped Over The Moon

Станет

[Fri Oct 31 20:27:24 2014] The Brown Cow Jumped Over The Moon

(сохраняя самую последнюю временную метку)


4
Да. Если бы вы опубликовали пример ввода и вывода, это может составить вопрос.
Джейсонвриан

3
Задавая этот тип вопроса, вы должны включить свой вход и желаемый результат. Мы не можем помочь, если мы должны угадать.
Terdon

1
«да» или «нет» кажется приемлемым ответом, что вы собираетесь делать с этими знаниями? В случае нет, продлить awk?
Антон

1
Ух ты. 80 000 респондентов утверждают, что это был непригодный вопрос (я бы не назвал его хорошим), но ни одного закрытого голосования?
Хауке Лагинг

5
@HaukeLaging кажется разумным дать ОП возможность отреагировать на наши комментарии. Теперь они это сделали, и вопрос значительно улучшился.
Terdon

Ответы:


14

Вы можете просто использовать uniqс его -fопцией:

uniq -f 4 input.txt

От man uniq:

  -f, --skip-fields=N
       avoid comparing the first N fields

На самом деле это будет отображать первую строку:

[Fri Oct 31 20:27:05 2014] The Brown Cow Jumped Over The Moon

Если это проблема, вы можете сделать:

tac input.txt | uniq -f 4

или если у вас нет, tacно ваши tailподдержки -r:

tail -r input.txt | uniq -f 4

1
Это ужасно круто :)
Рамеш

3
@Ramesh У некоторых из этих инструментов есть несколько неприятных полезных опций, которые, когда вы их знаете, побеждают любые вещи awk / perl / python, которые вы можете придумать.
Антон

4
awk '!seen[substr($0,27)]++' file

Это решение не покрывает часть метки времени, поскольку это не было частью вопроса, когда этот ответ был написан.
Хауке Лагинг

2
Именно поэтому многие из нас работают над тем, чтобы закрыть их, пока Q не будут полностью раскрыты. В противном случае эти Q тратят ваше время и OP.
СЛМ



0

Можно использовать силу vim:

:g/part of duplicate string/d

Очень просто. Если у вас есть еще пара файлов (например, gzipped повернутые логи), vimвы откроете их без предварительной распаковки и можете повторить последнюю команду, нажав :и . Как повторить последнюю команду в терминале.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.