Estoy tratando de imprimir líneas duplicadas desde el manejador de archivos, no eliminarlas o cualquier otra cosa que vea 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?Perl - Encontrar líneas duplicadas en un archivo o matriz
Respuesta
Utilizando las abreviaturas estándar de Perl:
my %seen;
while (<>) {
print if $seen{$_}++;
}
Como "de una sola línea":
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 única línea de en la entrada (que viene dewhile(<>)
en este caso)$seen{$_}
tendrá una ranura para escalar en el hash nombrado por el texto de la línea (esto es lo que$_
está haciendo en el tiene{}
llaves).- Usando el operador de incremento de sufijo (
x++
) nos tomamos el valor de nuestra expresión, recordando a la subasta 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 como falso. - entonces es incrementado a 1.
Por lo tanto, cuando el while
se pone en marcha, todas las líneas son "cero" (si ayuda a que se pueda imaginar las líneas como "no %seen
"), entonces, el primer Cuando veamos 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
y se imprima.
Ahora como dije anteriormente, %seen
declara un hash, pero con strict
desactivado, cualquier expresión variable puede crearse en el acto. Así que la primera vez que Perl ve $seen{$_}
sabe que estoy buscando %seen
, no lo tiene, por lo que lo crea.
Otra cosa interesante acerca de esto es que al final, si te interesa usarlo, tienes un recuento de cuántas veces se repitió cada línea.
+1 nice one-liner – mcgrailm
¿Puede explicar cómo funciona $ seen {$ _} ++ exactamente? Entiendo que está asignando el valor de la línea actual a una tabla hash, pero ¿qué hace el ++ aquí que lo hace encontrar duplicados? – Chris
$ seen {$ _} se refiere a un valor en el hash% visto, con la clave $ _, que es la línea actual. El operador ++ incrementará el valor hash. Esto significa que la primera vez que aparece una tecla, su valor será falso y la impresión no se realizará. Las siguientes veces que se ve, será> 0, y así se ejecutará la impresión, e imprime sin args por defecto imprime la variable $ _. – TLP
probar esto
#!/usr/bin/perl -w
use strict;
use warnings;
my %duplicates;
while (<DATA>) {
print if !defined $duplicates{$_};
$duplicates{$_}++;
}
Haría 'imprimir a menos que haya $ duplicados {$ _}'. Y +1 para '-w',' use strict' y 'use warnings'. – Blrfl
Si usted tiene un sistema similar a Unix, puede utilizar uniq
:
uniq -d foo
o
uniq -D foo
debe hacer lo que quiera. Más información: man uniq.
imprime dupes sólo una vez:
perl -ne "print if $seen{$_}++ == 1"
Esto es como 'sort file.txt | uniq -d' (solo imprime duplicados) en un shell típico de Unix. ¿Hay un simple equivalente de 'sort file.txt | uniq -u' (imprimir solo líneas únicas)? –
- 1. Eliminación de líneas duplicadas en un archivo usando Java
- 2. Eliminar líneas duplicadas del archivo de texto?
- 3. ¿Cómo puedo eliminar líneas duplicadas de un archivo?
- 4. Comando Linux o script que cuenta líneas duplicadas en un archivo de texto?
- 5. Perl un trazador de líneas para encontrar y reemplazar en un archivo con una variable
- 6. ¿Cómo puedo omitir líneas al sorber un archivo en Perl?
- 7. ¿Cómo encontrar identificaciones duplicadas en un formulario?
- 8. Buscar cadenas duplicadas en un archivo grande
- 9. lee un archivo en una matriz de líneas en d
- 10. ¿Listar solo líneas duplicadas basadas en una columna de un archivo delimitado por punto y coma?
- 11. Buscar líneas duplicadas en un archivo y contar cuántas veces se duplicó cada línea?
- 12. Leyendo un archivo grande línea por línea o almacenando sus líneas en una matriz
- 13. ¿Cómo puedo marcar/resaltar líneas duplicadas en el editor VI?
- 14. Eliminar cadenas duplicadas en matriz de cadenas
- 15. Grep para encontrar el elemento en la matriz Perl
- 16. Secuencia de comandos para encontrar duplicados en un archivo csv
- 17. ¿Puedo encontrar un nombre de archivo de un identificador de archivo en Perl?
- 18. ¿Cómo encontrar filas duplicadas basadas en múltiples campos en MySQL?
- 19. Eliminando líneas duplicadas contiguas en vi sin ordenar
- 20. Eliminar filas duplicadas de un archivo grande en Python
- 21. ¿Cómo sabe un programa Perl dónde encontrar el archivo que contiene el módulo Perl que utiliza?
- 22. ¿Cómo puedo obtener exactamente n líneas aleatorias de un archivo con Perl?
- 23. Herramienta para encontrar claves duplicadas y valor en el archivo de propiedades
- 24. ¿Cuál es la forma más defensiva de recorrer líneas en un archivo con Perl?
- 25. ¿Cómo cambio, elimino o inserto una línea en un archivo o añado al comienzo de un archivo en Perl?
- 26. ¿Cómo buscar líneas en un archivo entre dos marcas de tiempo usando Perl?
- 27. ¿Cómo puedo escribir solo ciertas líneas de un archivo en Perl?
- 28. ¿Cómo ingreso un comentario de varias líneas en Perl?
- 29. ¿Cómo ejecuto un trazador de líneas Perl de un archivo MAKE?
- 30. Agregar líneas a un archivo
Mucho depende del tamaño de la entrada, tamaños de líneas y el número potencial de duplicados. Si los requisitos de memoria son bajos, las soluciones con hash '% duplicates' son adecuadas. –
Ellos son. Solo estoy usando el identificador de archivo para comprobar rápidamente algo. No parece que haya ningún duplicado, eso está bien. – Chris