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

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.
СЛМ
3

Попробуй это:

awk -F ']' '{a[$2]=$1}END{for(i in a){print a[i]"]"i}}'
jimmij
источник
0

perlРешение:

perl -F']' -anle '$h{$F[1]} = $_; END{print $h{$_} for keys %h}' file
cuonglm
источник
0

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

:g/part of duplicate string/d

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

медиатор
источник