Entfernen Sie doppelte Zeilen aus einer Datei, die einen Zeitstempel enthält

8

Diese Frage / Antwort bietet einige gute Lösungen zum Löschen identischer Zeilen in einer Datei, funktioniert jedoch in meinem Fall nicht, da die ansonsten doppelten Zeilen einen Zeitstempel haben.

Ist es möglich, awk anzuweisen, die ersten 26 Zeichen einer Zeile bei der Ermittlung von Duplikaten zu ignorieren?

Beispiel:

[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

Würde werden

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

(Beibehaltung des neuesten Zeitstempels)

ein Kodierer
quelle
4
Ja. Wenn Sie ein Beispiel für eine Eingabe und Ausgabe veröffentlichen, kann dies eine Frage darstellen.
Jasonwryan
3
Wenn Sie diese Art von Frage stellen, müssen Sie Ihre Eingabe und Ihre gewünschte Ausgabe angeben. Wir können nicht helfen, wenn wir raten müssen.
Terdon
1
"Ja" oder "Nein" scheint eine akzeptable Antwort zu sein. Was wirst du mit diesem Wissen machen? Im Falle von nein awk verlängern?
Anthon
1
Beeindruckend. 80.000 Vertreter behaupten, dies sei eine unbrauchbare Frage (ich würde es nicht als gut bezeichnen), aber keine einzige enge Abstimmung?
Hauke ​​Laging
5
@HaukeLaging Es erscheint vernünftig, dem OP die Möglichkeit zu geben, auf unsere Kommentare zu reagieren. Sie haben dies jetzt getan und die Frage ist stark verbessert.
Terdon

Antworten:

14

Sie können nur uniqmit seiner -fOption verwenden:

uniq -f 4 input.txt

Von man uniq:

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

Tatsächlich wird die erste Zeile angezeigt:

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

Wenn das ein Problem ist, können Sie Folgendes tun:

tac input.txt | uniq -f 4

oder wenn Sie tacnur Ihre tailUnterstützung haben -r:

tail -r input.txt | uniq -f 4
Anthon
quelle
1
Das ist unglaublich großartig :)
Ramesh
3
@Ramesh Einige dieser Tools haben einige böse nützliche Optionen, die, wenn Sie sie kennen, alle awk / perl / python-Dinge übertreffen, die Sie sich einfallen lassen können.
Anthon
4
awk '!seen[substr($0,27)]++' file
Hauke ​​Laging
quelle
Diese Lösung deckt nicht den Zeitstempelteil ab, da dies nicht Teil der Frage war, als diese Antwort geschrieben wurde.
Hauke ​​Laging
2
Dies ist genau der Grund, warum viele von uns daran arbeiten, diese zu schließen, bis die Qs vollständig ausgearbeitet sind. Andernfalls verschwenden diese Fragen Ihre Zeit und die OPs.
slm
3

Probier diese:

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

Eine perlLösung:

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

Man kann Macht nutzen von vim:

:g/part of duplicate string/d

Sehr leicht. Wenn Sie mehrere weitere Dateien haben (z. B. gedippte gedrehte Protokolle), vimwerden diese ohne vorherige Dekomprimierung auf Ihrer Seite geöffnet, und Sie können den letzten Befehl durch Drücken von :und wiederholen . Genau wie beim Wiederholen des letzten Befehls im Terminal.

Neurotransmitter
quelle