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)

un codificador
fuente
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
Anthon
fuente
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
Hauke ​​Laging
fuente
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}}'
jimmij
fuente
0

Una perlsolución:

perl -F']' -anle '$h{$F[1]} = $_; END{print $h{$_} for keys %h}' file
Cuonglm
fuente
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.

Neurotransmisor
fuente