Salut,
Voila je cherche un petit conseil. Je possede deux fichiers: f1 et f2 (environ 100000 et 60000 lignes respectivement).
Ce que je souhaite faire c'est supprimer de f1 les entrees se trouvant dans f2. A priori facile.. mais ce que je cherche c'est la solution la plus rapide possible.
Pour l'instant je parcours mon fichier f2 et je fais un sed '/entre/d' f1. Ca marche mais c'est terriblement lent..
J'ai essaye un grep -v -f f2 f1mais c'est encore pire.
Alors si qqn a une idee, je suis preneur.
Petite precision, les fichiers f1 et f2 ne contiennent pas les memes donnees.
Merci
# fichier trié ?
Posté par Nicolas Boulay (site web personnel) . Évalué à 2.
Sinon, il faut avancer les 2 fichiers ensembles.
"La première sécurité est la liberté"
[^] # Re: fichier trié ?
Posté par TuxPierre . Évalué à 1.
En fait f1 contient pas mal d'infos (genre: cle blablabla) et f2 ne contient que des "cles" (une par ligne).
Donc je suis effectivement oblige de parcourir tout f2 (je pense..)
[^] # Re: fichier trié ?
Posté par Nicolas Boulay (site web personnel) . Évalué à 2.
"La première sécurité est la liberté"
[^] # Re: fichier trié ?
Posté par TuxPierre . Évalué à 1.
Je vais quand meme essayer de voir.
Merci de ta reponse
# Capillo-tracte
Posté par lom (site web personnel) . Évalué à 1.
voila une idee, non testee:
concatenation des 2 fichiers
~> cat f1 f2 > f3
selection des doublons (il faut trier d'abord)
~> sort f3 > f4; uniq -d f4 > doublons
concat doublons et f1
~> cat f1 doublons > f5
selection des lignes uniques de f1 (toutes celles qui sont aussi dans f2 sont en double dans f5)
~> sort f5; uniq f5 > f6
et hop, dans f6 tu as ce que tu veux!
Je pense que ca peut etre relativement rapide.
pour rigoler, ca doit pouvoir se faire en une ligne:
~> cat f1 `cat f1 f2 | sort | uniq -d` | sort | uniq
[^] # Re: Capillo-tracte
Posté par TuxPierre . Évalué à 1.
Comme dit plus haut, les fichiers ne contiennent pas les memes donnees.
f1 contient des infos + des "cles" (ex: cle blablabla) et f2 ne contient que "des cles" (une par ligne)
Donc meme en triant je n'aurais pas de doublon..
[^] # Re: Capillo-tracte
Posté par imalip . Évalué à 2.
grep -v "^cle " f1
ca peut pas le faire, si le but est juste de virer les lignes de clef ?
hmmm... F1... RB3... désolé, je m'égare...
[^] # Re: Capillo-tracte
Posté par lom (site web personnel) . Évalué à 1.
Desole, et bonne chance quand meme!
# Si tu peux utiliser autre chose que le shell...
Posté par lolop (site web personnel) . Évalué à 3.
(j'ai mis des . en début de ligne à la place des espaces because indentation en Python)
Qui supprime les lignes de f2 que l'on trouve exactement dans f1.
Mais j'ai vu ta petite précision les fichiers f1 et f2 ne contiennent pas les memes donnees et les discussions... bref tu recherche pour chaque ligne de f1 si elle contient une des lignes de f2... Ca serait bien le boulot d'une jolie expression régulière avec f2[0] | f2[1] | f2[3]... compilée en mémoire, et appliquée à chacune des lignes de f1. Ca peut se faire en Python (modulo peut-être la longueur d'une telle expression), mais il me semble que ce genre de traitement est le domaine naturel de Perl.
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
[^] # Re: Si tu peux utiliser autre chose que le shell...
Posté par lolop (site web personnel) . Évalué à 2.
[gaffe, j'avais oublié une indentation dans la ligne après celle du "if" dans mon post précédent.]
Ca correspond à la proposition qui a été fait d'utiliser un hash en Perl (là j'utilise un set en Python). Je ne pense pas que tu puisses trouver plus rapide comme algo.
Note: tout ça en considérant qu'il n'y a pas de problème de casse/marques diacritiques entre l'expression les clés dans F1 et celle dans f2.
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
[^] # Re: Si tu peux utiliser autre chose que le shell...
Posté par lolop (site web personnel) . Évalué à 2.
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
[^] # Re: Si tu peux utiliser autre chose que le shell...
Posté par TuxPierre . Évalué à 1.
Le fichier f1 est de la forme :
ip: blablabla
Le blabla peut etre de diverses formes.
Le fichier f2 contient une liste d'adresse ip (une par ligne)
[^] # Re: Si tu peux utiliser autre chose que le shell...
Posté par lolop (site web personnel) . Évalué à 2.
Ou bien directement dans le test:
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
[^] # Re: Si tu peux utiliser autre chose que le shell...
Posté par lolop (site web personnel) . Évalué à 2.
Note au cas où: ça s'appelle avec :
python remlines.py f1 f2 fsortie
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
[^] # Au final...
Posté par lolop (site web personnel) . Évalué à 2.
J'ai essayé avec f1:
Et f2:
python remlines.py f1 f2 fout
Dis nous ce que ça donne côté perfs sur tes gros fichiers.
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
# rien à voir avec le shell mais: sql
Posté par B. franck . Évalué à 2.
Avec les indexes et le delete from ... where... in(select... qui vont bien, ça pourrait prendre quelques secondes.
ou encore plus jouissif, un trigger sur f2 qui détruit l'enregistrement dans f1 correspondant...
ps: recommandé pour une utilisation répétées bien sûr
[^] # Re: rien à voir avec le shell mais: sql
Posté par TuxPierre . Évalué à 1.
Apres un petit test tout bete (et deux jolis index), l'operation ne mets que 4 secondes :)
C'est extremement efficace !!!!
Merci donc de ta reponse
PS: j'utilise une base SQL pour stocker d'autres donnees donc tout va bien.. mais si je ne l'avais pas.. le pb reste entier ;)
# Memory mapping
Posté par drakkar . Évalué à 1.
J'ai essayé un grep -v -f f2 f1mais c'est encore pire.
Et quid de l'option -mmap pour grep ? Il y avait déjà eu une astuce à ce propos: http://www.linuxfr.org/tips/269.html Cela vaut-il la peine d'être considéré ?
Certes, effectuer les traitements grâce à MySQL semble élégant et impressionnant en terme de vitesse, cependant, si l'on considère aussi l'importation des données, auparavant, le temps total pour effectuer toutes les opérations est sans doute plus long, non ?
[^] # Re: Memory mapping
Posté par TuxPierre . Évalué à 1.
Je ne connaissais pas l'option -mmap de grep mais malheureusement elle n'est pas dispo sous mon OS (OpenBSD)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.