Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/12/2007, 11h45   #1
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
Par défaut chercher lignes avec correspondance

Bonjour
j'ai deux fichiers texte. le premier :
fichier 1
---
a 1
a 2
b 1
b 2
c 1
c 2

le deuxième :
fichier 2
---
a
b

je veux avoir un fichier comme tel
fichier final
---
a 1
a 2
b 1
b 2

donc vous l'aurez compris, je veux avoir une liste de correpondance entre les articles (a et b et c) du fichier 1 qui existent dans le fichier 2

le probleme c'est que mon premier fichier est très volumineux (600 mega), du coup un grep peut mettre plus d'une journée à s'exécuter

Quelqu'un saurait un moyen rapide (efficace) de faire ceci
Merci
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2007, 11h57   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 562
Points : 7 562
Travaille dans l'autre sens :
Code :
1
2
3
while read ligne
do    grep -q "^${ligne%% *}$" fichier2 && echo "${ligne}" >> fichierfinal 
done < fichier1
Ainsi le fichier1 sera parcouru une seule fois

Moyen encore plus efficace : charge tes fichiers dans une base de données et fais une requête sur les tables ainsi alimentées.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2007, 12h38   #3
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
ca ne marche pas..
es tu sur de cette syntaxe?
Code :
grep -q "^${ligne%% *}$"
sinon a koi sert le && dans ca?? il s'agit d'une concatenation??

je n'arrive pas à saisir ton algorithme, tu peux m'eclairer stp?

merci
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2007, 12h58   #4
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 562
Points : 7 562
est équivalent à
Code :
$(echo ${ligne} | cut -d' ' -f1)
Code :
grep -q "^${ligne%% *}$" fichier2 && echo "${ligne}" >> fichierfinal
est équivalent à
Code :
1
2
3
4
if grep -q "^${ligne%% *}$" fichier2
then
 echo "${ligne}" >> fichierfinal
fi
Tout ça est expliqué là-dedans
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2007, 13h18   #5
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
alors je ne vois pas l'erreur, pourtant j'utilise exactement les memes fichiers que j'ai publiés pour mon test.

PS: "^" n'affiche t il pas le premier caractere??
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2007, 13h34   #6
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 562
Points : 7 562
^ signifie le début de la ligne
$ signifie la fin de la ligne
^CHAINE$ signifie donc une ligne qui ne contient que CHAINE
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2007, 13h44   #7
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
ok merci j'ai reussi a lfaire marcher.. c'etait une histoire de tab et d'espaces..

par contre, en parcourant l aide de grep, il s'est avere que fgrep fait ca a la perfection

Code :
fgrep -f fichier2 fichier1 >> fichierfinal
tout simplement, et beaucoup plus rapidement


merci qd meme
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2007, 13h49   #8
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 562
Points : 7 562
En effet, j'avais oublié l'option -f de grep.
Merci de me l'avoir rappelée.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h02.


 
 
 
 
Partenaires

Hébergement Web