Rimuovere le righe duplicate da un file che contiene un timestamp


8

Questa domanda / risposta ha alcune buone soluzioni per eliminare le linee identiche in un file, ma non funzionerà nel mio caso poiché le righe altrimenti duplicate hanno un timestamp.

È possibile dire a awk di ignorare i primi 26 caratteri di una riga nel determinare i duplicati?

Esempio:

[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

Potrebbe diventare

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

(mantenendo il timestamp più recente)


4
Sì. Se dovessi pubblicare alcuni esempi di input e output, questo potrebbe equivalere a una domanda.
Jasonwryan,

3
Quando si pone questo tipo di domanda, è necessario includere l'input e l'output desiderato. Non possiamo aiutare se dobbiamo indovinare.
terdon

1
"sì" o "no" sembra essere una risposta accettabile, che cosa hai intenzione di fare con quella conoscenza? In caso di no, estendere awk?
Anthon,

1
Wow. 80.000 rappresentanti sostengono che si trattava di una domanda inutilizzabile (non la definirei una buona risposta) ma non un voto da vicino?
Hauke ​​Laging,

5
@HaukeLaging sembra ragionevole dare all'OP la possibilità di reagire ai nostri commenti. Ora lo hanno fatto e la domanda è notevolmente migliorata.
terdon

Risposte:


14

Puoi semplicemente usare uniqcon la sua -fopzione:

uniq -f 4 input.txt

Da man uniq:

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

In realtà questo mostrerà la prima riga:

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

Se questo è un problema puoi fare:

tac input.txt | uniq -f 4

o se non hai tacma i tuoi tailsupporti -r:

tail -r input.txt | uniq -f 4

1
È terribilmente fantastico :)
Ramesh,

3
@Ramesh Alcuni di questi strumenti hanno alcune brutte opzioni utili che, quando li conosci, battono qualsiasi cosa awk / perl / python che puoi inventare.
Anthon,

4
awk '!seen[substr($0,27)]++' file

Questa soluzione non copre la parte del timestamp in quanto non faceva parte della domanda quando questa risposta è stata scritta.
Hauke ​​Laging,

2
Questo è esattamente il motivo per cui molti di noi lavorano per chiuderli fino a quando le Q non saranno state completamente definite. Altrimenti queste Q stanno sprecando il tuo tempo e gli OP.
slm

3

Prova questo:

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

0

Una perlsoluzione:

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

0

Si può usare il potere di vim:

:g/part of duplicate string/d

Molto facile. Se hai altri due file (come i log ruotati con gzip ), vimli aprirai senza alcuna decompressione preliminare dalla tua parte e puoi ripetere l'ultimo comando premendo :e . Proprio come ripetere l'ultimo comando nel terminale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.