6
votes

Perl - Trouvez des lignes en double dans le fichier ou le tableau

J'essaie d'imprimer des lignes en double à partir du fichierHandle, pas de les supprimer ou de rien d'autre que je vois sur d'autres questions. Je n'ai pas assez d'expérience avec Perl pour pouvoir le faire rapidement, alors je demande ici. Quelle est la façon de faire cela?


2 commentaires

Beaucoup dépend de la taille des entrées, des tailles de lignes et du nombre potentiel de doublons. Si les exigences de la mémoire sont faibles, les solutions avec un % de duplicates sont adéquates.


Ils sont. J'utilise simplement le fichier pour vérifier rapidement quelque chose. Il ne semble pas qu'il n'y ait aucun duplicate, c'est bien.


4 Réponses :


25
votes

Utilisation de la standard Perl Shorthands:

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


4 commentaires

Pouvez-vous expliquer comment $ vu {$ _} ++ fonctionne exactement? Je reçois que cela attribue la valeur de la ligne actuelle à une table de hachage, mais quel est le ++ faire ici qui le fait de trouver des doublons?


$ vu {$ _} fait référence à une valeur dans le% de hachage vu, avec la clé $ _, qui est la ligne actuelle. L'opérateur ++ augmentera la valeur de hachage. Cela signifie que la première fois qu'une clé apparaît, sa valeur sera fausse et l'impression ne se produira pas. Les temps suivants sont vus, ce sera> 0, et l'impression sera donc exécutée et imprimer sans args par défaut imprime la variable $ _.


Ah, donc la clé du hachage est la ligne, mais la valeur est le nombre de fois que cela a été trouvé dans le fichier -1.


Perl Nerds impressionne l'enfer de moi. +2 Si je pouvais!



3
votes

Essayez ceci xxx


1 commentaires

Je ferais imprimé sauf si vous n'existe pas de duplicates {$ _} . Et +1 pour -w , Utilisez strict et Utiliser des avertissements .



1
votes

Si vous avez un système de type UNIX, vous pouvez utiliser UNIQ : xxx

ou xxx p > devrait faire ce que tu veux. Plus d'informations: Man Uniq .


0 commentaires

3
votes

Imprime des dupes une seule fois:

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


1 commentaires

Ceci est comme trier fichier.txt | UNIQ -D (Imprimer uniquement des duplicats) dans une coque unix typique. Existe-t-il un équivalent simple de trier fichier.txt | UNIQ -U (Imprimer uniquement des lignes uniques)?