sublime repetidas remover quitar online líneas lineas linea leer fotos fichero eliminar duplicados duplicadas buscar archivos perl line-processing

repetidas - Perl-Encuentra líneas duplicadas en un archivo o matriz



quitar líneas duplicadas (4)

Intento imprimir líneas duplicadas desde Filehandle, no eliminarlas o cualquier otra cosa que veo en otras preguntas. No tengo suficiente experiencia con Perl para poder hacer esto rápidamente, así que estoy preguntando aquí. ¿Cuál es la manera de hacer esto?


Si tiene un sistema tipo Unix, puede usar uniq :

uniq -d foo

o

uniq -D foo

debería hacer lo que quieras Más información: man uniq .


prueba esto

#!/usr/bin/perl -w use strict; use warnings; my %duplicates; while (<DATA>) { print if !defined $duplicates{$_}; $duplicates{$_}++; }


Imprime a los incautos solo una vez:

perl -ne "print if $seen{$_}++ == 1"


Usando las agujas cortas estándar de Perl:

my %seen; while ( <> ) { print if $seen{$_}++; }

Como un "trazador de líneas":

perl -ne ''print if $seen{$_}++''

Más datos? Esto imprime <file name>:<line number>:<line> :

perl -ne ''print ( $ARGV eq "-" ? "" : "$ARGV:" ), "$.:$_" if $seen{$_}++''

Explicación de %seen :

  • %seen declara un hash. Para cada línea única en la entrada (que proviene de while(<>) en este caso) $seen{$_} tendrá una ranura escalar en el hash nombrado por el texto de la línea (esto es lo que $_ es haciendo en el tiene {} llaves).
  • Usando el operador de incremento postfix ( x++ ) tomamos el valor de nuestra expresión, recordando incrementarla después de la expresión. Entonces, si no hemos "visto", la línea $seen{$_} no está definida, pero cuando se la fuerza a un "contexto" numérico como este, se toma como 0 y es falsa .
  • Luego se incrementa a 1.

Entonces, cuando el while comience a correr, todas las líneas son "cero" (si le ayuda a pensar en las líneas como "not %seen "), la primera vez que vemos una línea, perl toma el valor indefinido, que falla el if - e incrementa el recuento en la ranura escalar a 1. Por lo tanto, es 1 para cualquier ocurrencia futura en que punto pase la condición if e impresa.

Ahora, como dije antes, %seen declara un hash, pero con el strict apagado, cualquier expresión variable puede crearse in situ. Así que la primera vez que Perl ve $seen{$_} sabe que estoy buscando %seen , no lo tiene, así que lo crea.

Otra cosa interesante sobre esto es que al final, si te interesa usarlo, tienes un recuento de cuántas veces se repitió cada línea.