Remove linhas duplicadas de um arquivo que contém um timestamp

8

Este pergunta / resposta algumas boas soluções para excluir linhas idênticas em um arquivo, mas não funcionarão no meu caso, já que as linhas duplicadas têm um timestamp.

É possível dizer ao awk para ignorar os primeiros 26 caracteres de uma linha na determinação de duplicatas?

Exemplo:

[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

se tornaria

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

(mantendo o timestamp mais recente)

    
por a coder 03.11.2014 / 17:15

5 respostas

13

Você pode usar apenas uniq com sua opção -f :

uniq -f 4 input.txt

De man uniq :

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

Na verdade, isso exibirá a primeira linha:

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

Se isso é um problema que você pode fazer:

tac input.txt | uniq -f 4

ou se você não tem tac , mas seu tail suporta -r :

tail -r input.txt | uniq -f 4
    
por 03.11.2014 / 20:16
4
awk '!seen[substr($0,27)]++' file
    
por 03.11.2014 / 17:35
3

Tente este:

awk -F ']' '{a[$2]=$1}END{for(i in a){print a[i]"]"i}}'
    
por 03.11.2014 / 19:15
0

Uma solução perl :

perl -F']' -anle '$h{$F[1]} = $_; END{print $h{$_} for keys %h}' file
    
por 04.11.2014 / 05:54
0

Pode-se usar o poder de vim :

:g/part of duplicate string/d

Muito fácil. Se você tiver mais alguns arquivos (como gzipped girado logs), vim irá abri-los sem qualquer descompressão preliminar do seu lado e você pode repetir o último comando pressionando : e . Apenas como repetir o último comando no terminal.

    
por 15.05.2015 / 00:07