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 dewhile(<>)
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.