Eliminar parcialmente duplicado de líneas por columna y mantener la última

Tengo un archivo que se parece a esto:

2011-03-21 name001 line1
2011-03-21 name002 line2
2011-03-21 name003 line3
2011-03-22 name002 line4
2011-03-22 name001 line5

para cada nombre, yo sólo quiero su última aparición. Así que, espero que el resultado sea:

2011-03-21 name003 line3
2011-03-22 name002 line4
2011-03-22 name001 line5

Podría alguien darme una solución con bash/awk/sed?

InformationsquelleAutor Dagang | 2011-03-25

4 Kommentare

  1. 39

    Este código conseguir uniq líneas por segundo campo, pero desde el final del archivo o texto (como en su resultado ejemplo)

    tac temp.txt | sort -k2,2 -r -u
    • Esa es una solución elegante!
    • muy bonito 🙂 gracias
    • Deseo tac fue en OSX.
    • Asegúrese de que la última línea de su archivo de entrada contiene un \n caso contrario tac concatenar con la penúltima línea
    • Para especificar otro separador, utilice la opción-t: tac temp.txt | sort -k1,1 -r -u [email protected]
    • ¿Te importaría explicar los parámetros de ordenación -k2,2? 🙂

  2. 11
    awk '{a[$2]=$0} END {for (i in a) print a[i]}' file

    Si la orden de la apariencia es importante:

    • Basado en la primera aparición:

      awk '!a[$2] {b[++i]=$2} {a[$2]=$0} END {for (i in b) print a[b[i]]}' file
    • Se basa en la última aparición:

      tac file | awk '!a[$2] {b[++i]=$2} {a[$2]=$0} END {for (i in b) print a[b[i]]}'
    • Esta es buena, sencilla y robusta. El orden de salida no coincide con el orden de la salida si que es importante. Hay una manera fácil de arreglar eso?
    • sí, pero el resultado será mucho más complejo programa awk. Voy a editar mi respuesta.
    • En realidad, yo era el significado sólo revertir la impresión de la matriz en lugar de la entrada que fue seleccionado. De modo que la salida sería en el orden del tiempo: línea 3, línea 4, línea 5, en lugar de la línea 5, línea 4, línea 3. +1 de mí para la primera respuesta simple. Oh, espera, sí – veo que es lo que estaba haciendo – no se estúpidamente complejo.
    • oh, no he entendido 🙂 … bueno, siempre se puede canalizar su salida a sort. sería mucho más sencillo que tratar de meter todo en awk.
    • He utilizado la más simple, y agregar especie de sello de tiempo del campo después de eso. Realmente es una buena solución, gracias!
  3. 6
    sort < bar > foo
    uniq  < foo > bar

    bar ahora no se ha duplicado líneas

    • Dada la OP ejemplo, todas las líneas sería considerado como único. Él sólo quiere el segundo campo se utiliza para determinar la singularidad.
    • +1 …pero esto responde el título (‘bash eliminar duplicados de líneas» en el momento), que es lo que Google parecía el uso de enviarme aquí!
  4. 4

    EDIT: he Aquí una versión que en realidad responde a la pregunta.

    sort -k 2 filename | while read f1 f2 f3; do if [ ! "$f2" = "$lf2" ]; then echo "$f1 $f2 $f3"; lf2="$f2"; fi; done
    • Creo que awk secuencia de comandos de implementación de la misma lógica debería ser más eficiente.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea