Supprimer les lignes en double d'un fichier contenant un horodatage

8

Cette question / réponse a de bonnes solutions pour supprimer des lignes identiques dans un fichier, mais ne fonctionnera pas dans mon cas car les lignes en double ont un horodatage.

Est-il possible de dire à awk d'ignorer les 26 premiers caractères d'une ligne pour déterminer les doublons?

Exemple:

[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

Deviendrait

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

(en conservant l'horodatage le plus récent)

un codeur
la source
4
Oui. Si vous deviez publier des exemples d'entrées et de sorties, cela pourrait constituer une question.
jasonwryan
3
Lorsque vous posez ce type de question, vous devez inclure votre entrée et votre sortie souhaitée. Nous ne pouvons pas aider si nous devons deviner.
terdon
1
«oui» ou «non» semble être une réponse acceptable, qu'allez-vous faire de cette connaissance? En cas de non, prolonger awk?
Anthon
1
Sensationnel. 80 000 représentants affirment que c'était une question inutilisable (je ne dirais pas que c'est une bonne question) mais pas un seul vote serré?
Hauke ​​Laging du
5
@HaukeLaging, il semble raisonnable de donner au PO la possibilité de réagir à nos commentaires. Ils l'ont maintenant fait et la question s'est considérablement améliorée.
terdon

Réponses:

14

Vous pouvez simplement utiliser uniqavec son -foption:

uniq -f 4 input.txt

De man uniq:

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

En fait, cela affichera la première ligne:

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

Si c'est un problème, vous pouvez faire:

tac input.txt | uniq -f 4

ou si vous n'en avez pas tacmais vos tailsupports -r:

tail -r input.txt | uniq -f 4
Anthon
la source
1
C'est incroyablement génial :)
Ramesh
3
@Ramesh Certains de ces outils ont des options utiles désagréables qui, lorsque vous les connaissez, battent tout ce que vous pouvez trouver avec awk / perl / python.
Anthon
4
awk '!seen[substr($0,27)]++' file
Hauke ​​Laging
la source
Cette solution ne couvre pas la partie horodatage car cela ne faisait pas partie de la question lorsque cette réponse a été écrite.
Hauke ​​Laging
2
C'est exactement pourquoi beaucoup d'entre nous travaillent à les fermer jusqu'à ce que les Q soient complètement étoffés. Sinon, ces Q vous font perdre votre temps et les OP.
slm
3

Essaye celui-là:

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

Une perlsolution:

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

On peut utiliser la puissance de vim:

:g/part of duplicate string/d

Très facile. Si vous avez quelques fichiers supplémentaires (tels que des journaux pivotés gzippés ), vous les ouvrirez vimsans aucune décompression préalable de votre côté et vous pouvez répéter la dernière commande en appuyant sur :et . Tout comme la répétition de la dernière commande dans le terminal.

Neurotransmetteur
la source