Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/11/2006, à 16: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 smile

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, à 16:15)

Hors ligne

#2 Le 27/11/2006, à 18: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 smile

Beamo

Dernière modification par Beamo (Le 27/11/2006, à 18:31)

Hors ligne

#3 Le 27/11/2006, à 18: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, à 18: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 ! smile

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, à 18:47)

Hors ligne

#5 Le 27/11/2006, à 23: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, à 12:59

Beamo

Re : faire un tri de fichier

JoelS a écrit :
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, à 16: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, à 17: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, à 17:42

next-d

Re : faire un tri de fichier

parfait merci

Hors ligne

#10 Le 28/11/2006, à 20: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, à 09:00

next-d

Re : faire un tri de fichier

oulala
je vais commencé a etre perdu moi

Hors ligne

#12 Le 29/11/2006, à 22:54

JoelS

Re : faire un tri de fichier

Beamo a écrit :

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!!!!

Balkoth a écrit :

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.

next-d a écrit :

oulala
je vais commencé a etre perdu moi

Mais non, mais non, ....

Hors ligne

#13 Le 02/12/2006, à 15:20

neofungamer

Re : faire un tri de fichier

faut parcourir ton fichier smile en C/C++ ou en JAVA c'est pas difficile smile
tu peux meme le faire en shell si t'es chaud