Pages : 1
#1 Le 27/11/2006, à 15:14
- next-d
faire un tri de fichier
bonjour,
j'ai deux fichiers txt
l'un avec 15000 emails
et l'autre environ 100
comment faire le plus simplement verifier si mes 100 emails sont presents ou non dans ma premiere liste
et comment faire pour les enlever s'ils sont presents?
le faire a la main c'est trop long
avez vous des infos?
mes fichiers sont comme ca
vvvv@vvv.com
rrrr@rrrr.fr
etc.....
merci
Dernière modification par next-d (Le 27/11/2006, à 15:15)
Hors ligne
#2 Le 27/11/2006, à 17:29
- Beamo
Re : faire un tri de fichier
Bonjour,
#!/bin/bash
cp list list.bkp
i=1
j=$(awk 'END {print NR}' list-remove)
while [ $i -le $j ]
do
mail=$(head -$i list-remove | tail -1)
cat list | sed s/$mail//g > listtemp
cat listtemp > list
i=$(expr $i + 1)
done
cat list | grep @ > list
rm -f listtemp
list = la liste de 15000 mails
list-remove = liste des 100 mails
Si les listes sont bien au format XXX@YYYY c'est pas propre mais ca devrait passer ;D
list.bkp est créé au cas ou
Beamo
Dernière modification par Beamo (Le 27/11/2006, à 17:31)
Hors ligne
#3 Le 27/11/2006, à 17:31
- next-d
Re : faire un tri de fichier
peux tu donner un peu d'explication pour les novices comme moi
merci
histoire d'apprendre un peu
Hors ligne
#4 Le 27/11/2006, à 17:42
- Beamo
Re : faire un tri de fichier
Alors le principe :
On récupère chaque ligne du fichier list-remove et on l'efface dans list !
cp list list.bkp
juste pour avoir un backup en cas de plantage ou en cas de bug
i=1
j=$(awk 'END {print NR}' list-remove)
i sera la valeur de la ligne que l'on récupère dans list-remove, on commence à la première ligne.
j est la valeur du nombre de lignes dans list-remove (ici ~100 si j'ai bien suivi)
while [ $i -le $j ]
do
...
done
Une boucle -> "tant que la ligne < au nbr de ligne total du fichier" afin de parcourir tout le fichier mais pas plus.
mail=$(head -$i list-remove | tail -1)
head -X affiche les X premières lignes, si l'on fait ensuite un tail -1 (affiche la dernière ligne) on aura juste la Xième ligne d'affichée
Ici c'est l'adressse que l'on voudra supprimer, on la stocke dans la variable mail.
cat list | sed s/$mail//g > listtemp
sed permet de faire un remplacement, on remplace ici l'adresse mail ($mail) par un vide dans le fichier list.
i=$(expr $i + 1)
On incrémente i pour passer à la ligne suivante lors du prochain passage dans la boucle.
cat list | grep @ > list
Comme je ne savais pas supprimer les lignes mais juste les remplacer par un blanc, je rajoute cette ligne qui va récupérer toutes les lignes de list ayant un "@". Celles avec un blanc ne seront donc pas prises en compte
Voila
Beamo
Dernière modification par Beamo (Le 27/11/2006, à 17:47)
Hors ligne
#5 Le 27/11/2006, à 22:16
- JoelS
Re : faire un tri de fichier
i=1 j=$(awk 'END {print NR}' list-remove)
i sera la valeur de la ligne que l'on récupère dans list-remove, on commence à la première ligne.
j est la valeur du nombre de lignes dans list-remove (ici ~100 si j'ai bien suivi)
ou plus simple
j=$(cat list-remove | wc -l)
Hors ligne
#6 Le 28/11/2006, à 11:59
- Beamo
Re : faire un tri de fichier
j=$(cat list-remove | wc -l)
Exact c'est plus propre, je cherchais justement comment faire ca avec "wc" mais un wc -l list-remove me donnait "4 list-remove" et j'étais obligé de faire un awk derrière pour récupérer juste le 4 donc pas de grosse amélioration ;D
Une idée pour que lors de mon sed je ne passe pas par un fichier listtemp ?
cat list | sed s/$mail//g > list <- Ca marche pas...
Beamo
Hors ligne
#7 Le 28/11/2006, à 15:51
- next-d
Re : faire un tri de fichier
comment je peux utiliser un programme comme unix2dos ou dos2unix dans ce script?
......
rm -f listtemp
unix2dos list
non?
Hors ligne
#8 Le 28/11/2006, à 16:32
- Beamo
Re : faire un tri de fichier
Oui
Lorsque l'on fait un script en bash on a disposition toutes les commandes d'un terminal (bash) et elles s'utilisent de la même façon.
En fait pour être plus précis le script commence par démarrer un environnement bash (donc comme un terminal) puis il execute toutes les commandes du fichier dedans.
Beamo
Hors ligne
#9 Le 28/11/2006, à 16:42
- next-d
Re : faire un tri de fichier
parfait merci
Hors ligne
#10 Le 28/11/2006, à 19:58
- Balkoth
Re : faire un tri de fichier
Pour sed, c'est l'option -i pour modifier le fichier d'entrée.
Donc : sed -i s/$mail//g list
Hors ligne
#11 Le 29/11/2006, à 08:00
- next-d
Re : faire un tri de fichier
oulala
je vais commencé a etre perdu moi
Hors ligne
#12 Le 29/11/2006, à 21:54
- JoelS
Re : faire un tri de fichier
cat list | sed s/$mail//g > list <- Ca marche pas...
Normal, mais il faut savoir comment le shell interpréter tes commandes.
La tu exécutes une commande (cat) sur un fichier, et tu connectes l'entrée d'une commande (sed) sur la sortie de la première puis tu rediriges la sortie de la seconde vers un fichier. C'est comme ça que tu l'écris. Mais le shell lui fait pas tout à fait dans cet ordre: il ouvre d'abord le fichier de sortie en écriture et le 'rembobine' au début (à cause du > au lieu de >>), puis lance la première commande, puis lance la seconde, puis connecte la sortie de la première sur l'entrée de la seconde et enfin connecte la sortie de la seconde sur la redirection vers le fichier. Cest le seul moyen d'être sûr que tout va se connecter correctement (j'ai zappé la phase d'évaluation des variables et autres joyeusetés du shell....).
La conséquence, c'est que ton fichier est vidé avant même d'être ouvert en lecture par cat! Donc cat envoie un contenu 'nul' de fichier vers sed qui n'a rien à faire. Ton fichier de sortie est désespérement vide!!!!
sed -i s/$mail//g list
Dans ce cas le shell ne fait rien de particulier, c'est sed qui s'occupe d'ouvrir et de fermer le fichier correctement, et ça marche. Mais c'est pas portable sur la plupart des Unix traditionnels, sauf peut être ceux qui intégrent de base les outils GNUs.
oulala
je vais commencé a etre perdu moi
Mais non, mais non, ....
Hors ligne
#13 Le 02/12/2006, à 14:20
- neofungamer
Re : faire un tri de fichier
faut parcourir ton fichier en C/C++ ou en JAVA c'est pas difficile
tu peux meme le faire en shell si t'es chaud
Pages : 1