Eliminar líneas duplicadas de un archivo que contiene una marca de tiempo


8

Esta pregunta / respuesta tiene algunas buenas soluciones para eliminar líneas idénticas en un archivo, pero no funcionará en mi caso, ya que las líneas duplicadas tienen una marca de tiempo.

¿Es posible decirle a awk que ignore los primeros 26 caracteres de una línea para determinar duplicados?

Ejemplo:

[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 convertiría

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

(manteniendo la marca de tiempo más reciente)


44
Si. Si publicara alguna entrada y salida de ejemplo, esto podría equivaler a una pregunta.
jasonwryan

3
Al hacer este tipo de pregunta, debe incluir su entrada y su salida deseada. No podemos ayudar si tenemos que adivinar.
terdon

1
"sí" o "no" parece ser una respuesta aceptable, ¿qué vas a hacer con ese conocimiento? En caso de no, extender awk?
Anthon

1
Guau. 80,000 representantes afirman que esta era una pregunta inutilizable (no la llamaría buena) pero ¿ni un solo voto cerrado?
Hauke ​​Laging

55
@HaukeLaging parece razonable darle al OP la oportunidad de reaccionar a nuestros comentarios. Ahora lo han hecho y la pregunta ha mejorado mucho.
terdon

Respuestas:


14

Solo puede usar uniqcon su -fopción:

uniq -f 4 input.txt

De man uniq:

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

En realidad, esto mostrará la primera línea:

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

Si eso es un problema, puede hacer:

tac input.txt | uniq -f 4

o si no tienes tacpero tus tailapoyos -r:

tail -r input.txt | uniq -f 4

1
Eso es perversamente increíble :)
Ramesh

3
@Ramesh Algunas de estas herramientas tienen algunas opciones útiles desagradables que, cuando las conoces, superan cualquier cosa awk / perl / python que se te ocurra.
Anthon

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

Esta solución no cubre la parte de la marca de tiempo, ya que no era parte de la pregunta cuando se escribió esta respuesta.
Hauke ​​Laging

2
Esto es exactamente por qué muchos de nosotros trabajamos para cerrarlos hasta que las Q se hayan desarrollado por completo. De lo contrario, estas Q están desperdiciando su tiempo y las OP.
slm

3

Prueba este:

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

0

Una perlsolución:

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

0

Uno puede usar el poder de vim:

:g/part of duplicate string/d

Muy fácil. Si tiene un par de archivos más (como registros rotados comprimidos ), vimlos abrirá sin ninguna descompresión preliminar de su lado y puede repetir el último comando presionando :y . Justo como repetir el último comando en la terminal.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.