Remova linhas duplicadas de um arquivo que contém um carimbo de data / hora

8

Esta pergunta / resposta tem algumas boas soluções para excluir linhas idênticas em um arquivo, mas não funcionará no meu caso, pois as linhas duplicadas têm um carimbo de data / hora.

É 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)

um codificador
fonte
4
Sim. Se você postar algum exemplo de entrada e saída, isso pode ser uma pergunta.
jasonwryan #
3
Ao fazer esse tipo de pergunta, você precisa incluir sua entrada e a saída desejada. Não podemos ajudar se tivermos que adivinhar.
terdon
1
"sim" ou "não" parece ser uma resposta aceitável, o que você fará com esse conhecimento? Em caso de não, estenda awk?
Anthon
1
Uau. 80.000 representantes afirmam que essa é uma pergunta inutilizável (eu não diria que é uma boa), mas não uma votação fechada?
Hauke ​​Laging
5
@HaukeLaging parece razoável dar ao OP a chance de reagir aos nossos comentários. Eles já o fizeram e a questão foi muito melhorada.
terdon

Respostas:

14

Você pode apenas usar uniqcom sua -fopção:

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 for um problema, você pode fazer:

tac input.txt | uniq -f 4

ou se você não tiver, tacmas seus tailsuportes -r:

tail -r input.txt | uniq -f 4
Anthon
fonte
1
Isso é perversamente incrível :)
Ramesh
3
@Ramesh Algumas dessas ferramentas têm algumas opções úteis que, quando você as conhece, superam qualquer coisa do awk / perl / python que você pode criar.
Anthon
4
awk '!seen[substr($0,27)]++' file
Hauke ​​Laging
fonte
Esta solução não cobre a parte do carimbo de data / hora, pois isso não fazia parte da pergunta quando esta resposta foi escrita.
Hauke ​​Laging
2
É exatamente por isso que muitos de nós trabalhamos para fechá-las até que os Qs sejam totalmente desenvolvidos. Caso contrário, esses Qs estão desperdiçando seu tempo e os OPs.
Slm
3

Tente este:

awk -F ']' '{a[$2]=$1}END{for(i in a){print a[i]"]"i}}'
jimmij
fonte
0

Uma perlsolução:

perl -F']' -anle '$h{$F[1]} = $_; END{print $h{$_} for keys %h}' file
cuonglm
fonte
0

Pode-se usar o poder de vim:

:g/part of duplicate string/d

Muito fácil. Se você tiver mais alguns arquivos (como logs girados em gzip ), vimeles serão abertos sem qualquer descompressão preliminar do seu lado e você poderá repetir o último comando pressionando :e . Assim como repetir o último comando no terminal.

Neurotransmissor
fonte