|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Inscription : août 2011 Messages : 22 ![]() |
Bonjour à tous,
Je souhaite réaliser une opération simple de recherche dans un fichier à partir d'une liste. J'ai des lignes dans un fichier avec plusieurs champs: Format du fichier DATA (Les lettre a,b,c pour le numéro de ligne, et les nombres 1,2,3 pour le numéro du champ. DATA Ligne 1 Champ a1 Champ a2 Champ a3... Ligne 2 Champ b1 Champ b2 Champ b3... Ligne 3 Champ c1 Champ c2 Champ c3... Ligne 4 Champ d1 Champ d2 Champ d3... Ligne 5 Champ e1 Champ e2 Champ e3... Dans un deuxième fichier j'ai une liste de champs. LISTE Ligne1 Champ a2 Ligne2 Champ c2... Ligne3 Champ e2... Je cherche à faire ressortir toutes les lignes qui ressortent de DATA lorsque le Champ [a-z]2 du fichier LISTE match avec le Champ [a-z]2 du fichier DATA Dans ce cas précis je cherche à récupérer du fichier DATA Fichier résultat Ligne 1 Champ a1 Champ a2 Champ a3... Ligne 3 Champ c1 Champ c2 Champ c3... Ligne 5 Champ e1 Champ e2 Champ e3... J'ai trouvé une solution avec sed en générant une série de commande sed à partir de mon fichier LISTE via excel. sed -n '/12345/p' DATA;sed -n '/6789A/p' DATA;sed -n '/BCDEF/p' DATA En procédant de cette manière, cela fonctionne très bien or c'est très long car le fichier DATA fait plus d'1go de données texte :/ En effet je redemande à chaque commande de reparcourir le fichier DATA, alors que si je pouvais travailler avec sed sur une seule ouverture du fichier je gagnerai en temps d'exécution, à moins que je ne me trompe et que sed n'est pas du tout adapté pour ce cas. Si quelqu'un a déjà été confronté à ce cas, je suis preneuse. |
|
|
10
|
|
|
#2 |
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 445 ![]() |
regarde du côté de la commande join
__________________
Modérateur Langage 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 ![]() |
|
|
20
|
|
|
#3 |
|
Membre du Club
![]() Inscription : août 2009 Messages : 65 ![]() |
L'idée est de lire une seule et unique fois ton fichier DATA et de le ventiler en fichiers élémentaires.
La commande : va générer les fichiers suivants : a2 b2 c2 d2 .... Le fichier a2 contiendra tous les enregistrements dont la seconde colonne est a2 et ainsi de suite.... Ensuite, il suffit de lire ton fichier LISTE. Si tu trouves a2 dans ton fichier LISTE, il suffira d'utiliser Si tu trouves b2 dans ton fichier LISTE, il suffira d'utiliser Les fichiers qui ne sont pas dans LISTE seront à supprimer à la fin. Je ne sais pas si c'est la solution la plus intelligente |
|
|
20
|
|
|
#4 | ||||||
|
Membre du Club
![]() Inscription : août 2009 Messages : 65 ![]() |
Contenu du fichier DATA
Code :
Commande gawk Génération des fichiers Contenu d'un fichier Traitement Code :
Code :
|
||||||
|
|
20
|
|
|
#5 | ||
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Salut,
@emmachane : Pourquoi se compliquer la vie ? Code :
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
||
|
|
20
|
|
|
#6 |
|
Membre du Club
![]() Inscription : août 2009 Messages : 65 ![]() |
C'est la raison pour laquelle, j'ai annoncé d'entrée que ce n'est peut-être pas la façon la plus intelligente de faire
|
|
|
20
|
|
|
#7 | ||
|
Nouveau Membre du Club
![]() Inscription : août 2011 Messages : 22 ![]() |
Merci beaucoup emmachane et Zipe31 !
Pour une raison que j'ignore encore cela ne marche pas chez moi J'ai strictement recopié le code ci-dessus et utilisé les mêmes noms de fichiers. Code :
Je tourne sur du BASH, c'est peut-être ça le problème, la commande fgrep n'est pas reconnue...??? En plus fgrep est la fonction adapté pour ce type de problème alors je ne comprend pas, d'un seul coup je suis perdue.... |
||
|
|
10
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() francois Ingénieur systèmes et réseaux Inscription : juillet 2006 Messages : 3 535 ![]() |
si tu ne l'as pas tu peux tjrs l'installer, soit depuis un package si il est disponible soit depuis ses sources.
|
|
|
10
|
|
|
#9 | ||||
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Citation:
Déjà l'interpréteur utilisé n'a pas d'effet sur le fait qu'une commande soit connue ou pas. Et si fgrep n'était pas reconnue, il te mettrait un truc style "fgrep not found". Citation:
Code bash :
cat list |while read val; do grep "$val" DATA; done
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
||||
|
|
11
|
|
|
#10 | |
|
Membre habitué
![]() Étudiant Inscription : août 2011 Messages : 46 ![]() |
Citation:
cette écriture est meilleur : Code :
while read val; do grep "$val" DATA; done < list |
|
|
|
11
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Avis purement subjectif. Les deux écritures ont des avantages comme des inconvénients. Celle que j'ai utilisée permet d'appliquer un traitement sur n'importe quel flux entrant issu d'une commande (ping, traceroute, etc). Mais aura l'inconvénient de ne pas pouvoir mémoriser de variable (perdue en fin de pipe). La tienne permet de créer et conserver des variables mais ne peut traiter qu'un fichier...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|
|
11
|
|
|
#12 | |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Citation:
Code :
while read val; do grep "$val" DATA; done < <(list toto fich)
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
|
11
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() Inscription : février 2008 Messages : 2 070 ![]() |
Bonjour,
<(liste) est une substitution de processus, où liste est une liste de commandes, pas une liste de fichiers. |
|
|
20
|
|
|
#14 | |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Salut,
Citation:
Code :
while read val; do grep "$val" DATA; done < <(cat list toto fich)
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
|
20
|
|
|
#15 |
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
As-tu remarqué que mon post de ce matin était en réponse à la remarque de Levi59 "useless use of cat" ?
Donc on passe de cat fic | while read à while read ... << (cat fic)Wééé
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|
|
20
|
|
|
#16 | |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Citation:
Attention toutefois, la syntaxe est "< <(cat ...)" et non pas "<<(cat...)" Mais hormis mon oubli du "cat", c'était surtout pour souligner également le fait qu'on évite un sous-shell et donc que les variables créées restent exploitables
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
|
20
|
|
|
#17 | |||||
|
Nouveau Membre du Club
![]() Inscription : août 2011 Messages : 22 ![]() |
Merci à tous pour votre aide, cela fonctionne très bien!
J'ai réussi à réaliser ceci: Code :
Code :
En faite elle marche très bien, même pour la valeur a2 (du fichier list) par exemple contenu dans une chaine de caractères 2a2xxx78 (du fichier DATA) par exemple. La remarque de Sve@r est donc justifié Citation:
Merci donc à tous, pour une grande débutante sous linux, j'ai apprise beaucoup de choses merci |
|||||
|
|
10
|
|
|
#18 | |
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Citation:
Débutante mais déjà au fait de manipulation de fichiers, des outils comme grep, dos2unix, etc donc déjà bien à l'aise...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|
|
|
10
|
|
|
#19 | |||
|
Membre habitué
![]() Étudiant Inscription : août 2011 Messages : 46 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#20 | |||||
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Citation:
Accessoirement, rajouter une structure de boucle shell (qui, rappelons-le, reste "interprété") juste pour éviter d'utiliser cat (qui, rappelons-le, est un programme "compilé") est, à mon avis, peu judicieux !!! Code bash :
Ce n'est pas parce que, parfois, le cat est utilisé inutilement qu'il faut commencer à le faire passer pour un truc d'hérétique à éviter à tout prix !!! En plus, je suis sûr que le "Useless use of cat" a été créé pour limiter des trucs du style cat fic |grep machin...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|||||
|
|
10
|
Copyright © 2000-2012 - www.developpez.com