Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1503 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Requete croisée entre plusieurs tableaux (comme dans une DB)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Requete croisée entre plusieurs tableaux (comme dans une DB)

n°2191709
bugmax
Posté le 25-05-2013 à 09:52:12  profilanswer
 

Bonjour,
 
J'ai un listing de valeurs à 2 dimensions :
Par exemple un tableau qui contiendrai #Nom;#Email :
toto;bing@pouet.fr
tata;bang@pouet.fr
tutu;bong@pouet.fr
....
 
J'ai un second listing de valeurs #Nom;#Numero
toto;04356374
tata;08988762
tutu;09089870
.....
 
Je vouvrai pouvoir en bash, générer automatique un troisieme tableau à partir des 2 premiers (#Email;#Numero)
bing@pouet.fr;04356374
bang@pouet.fr;08988762
bong@pouet.fr;09089870
.....
 
C'est un peu comme si l'on faisait des requetes croisées entre 2 table mysql via une clé commune aux 2 tables.... mais en bash.
 
Je sais qu'il me faut une boucle avec es tableaux associatif ainsi que la commande eval... mais je ne trouve pas de solution qui fonctionne....
 
Merci par avance pour votre aide !
 

mood
Publicité
Posté le 25-05-2013 à 09:52:12  profilanswer
 

n°2191713
Nukolau
Posté le 25-05-2013 à 12:32:18  profilanswer
 

La commande join fait ça très bien. Par exemple :

 
Code :
  1. join -o "1.2,2.2"  -t ';' file1 file2
 

devrait te sortir ce qu'il te faut. Par contre il faut que les deux fichiers soient triés sur le premier champ.


Message édité par Nukolau le 25-05-2013 à 12:35:25
n°2191880
bugmax
Posté le 27-05-2013 à 17:04:58  profilanswer
 

Merci beaucoup.
 
Cependant, cela j'ai l'impression que cela fonctionne que lorsque chaque ligne du fichier 1 est au même emplacement que son équivalente dans le fichier 2.
 
Mon exemple était un peu trop "parfait" :
 
Dans mon cas, même si je trie par ordre numeric ou alphabetique les 2 fichiers, les lignes ne sont pas au même rangs car il y par exemple certaine ligne qui n'ont pas d'équivalences d'un coté ou de l'autre.
 
Par exemple on aurait d'un coté :
 
toto;bong@pouet.fr
titi;bing@pouet.fr
tata;bang@pouet.fr
tutu;bung@pouet.fr
 
et de l'autre :
 
titi;07348264
tata;9748372
tete;1625234
 
Dans ce cas là le résultat ne serait que :
 
bing@pouet.fr;07348264
bang@pouet.fr;9748372
 
Puisque que toto et tete ne sont présent que dans 1 des 2 listings....
 
 
Pire, certaine lignes peuvent également amener à plusieurs références comme par exemple :
 
Listing 1 :
ploplop;plop@pouet.fr
pliplip;plip@pouet.fr
plaplap;plap@pouet.fr
 
et
 
Listing 2:
ploplop;347622
pliplip;0457632
pliplip;8734623
plaplap;892839
 
Donnerait :
 
plop@pouet.fr;347622
plip@pouet.fr;0457632
plip@pouet.fr;8734623
plap@pouet.fr;892839
 
 
 
Comme un select en liant 2 tables via une clé et en interogant une valeur d'une table a partir de la valeur de la seconde.... sauf que ça serait en bash.....
 
Merci par avance en tout cas !

Message cité 1 fois
Message édité par bugmax le 27-05-2013 à 17:35:58
n°2191905
Nukolau
Posté le 27-05-2013 à 23:41:56  profilanswer
 

bugmax a écrit :


Cependant, cela j'ai l'impression que cela fonctionne que lorsque chaque ligne du fichier 1 est au même emplacement que son équivalente dans le fichier 2. [...]Dans mon cas, même si je trie par ordre numeric ou alphabetique les 2 fichiers, les lignes ne sont pas au même rangs car il y par exemple certaine ligne qui n'ont pas d'équivalences d'un coté ou de l'autre.


 
Oui comme dit, il est impératif de faire un sort des fichiers avant le join. Mais l'absence d'un ligne dans l'un des fichiers ne pose pas de problème.  
Je viens de tester et c'est exactement ce que j'obtiens avec avoir fait un sort sur les fichiers :

Code :
  1. nukolau@NAS:~$ cat 1.txt ; echo ; cat 2.txt ; echo ; join -o "1.2,2.2"  -t ';' 1.txt 2.txt
  2. tata;bang@pouet.fr
  3. titi;bing@pouet.fr
  4. toto;bong@pouet.fr
  5. tutu;bung@pouet.fr
  6. tata;9748372
  7. tete;1625234
  8. titi;07348264
  9. bang@pouet.fr;9748372
  10. bing@pouet.fr;07348264


 

bugmax a écrit :


Pire, certaine lignes peuvent également amener à plusieurs références comme par exemple [...]


 
pareil, chez moi ça ne pose aucune problème une fois le sort réalisé :
 

Code :
  1. nukolau@NAS:~$ cat 11.txt ; echo ; cat 22.txt ; echo ; join -o "1.2,2.2"  -t ';' 11.txt 22.txt
  2. plaplap;plap@pouet.fr
  3. pliplip;plip@pouet.fr
  4. ploplop;plop@pouet.fr
  5. plaplap;892839
  6. pliplip;0457632
  7. pliplip;8734623
  8. ploplop;347622
  9. plap@pouet.fr;892839
  10. plip@pouet.fr;0457632
  11. plip@pouet.fr;8734623
  12. plop@pouet.fr;347622


 
Pour info, ma version de join (celle par défaut sur ubuntu server LTS)

Citation :


nukolau@NAS:~$ join --version
join (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
 
Written by Mike Haertel.


n°2192070
bugmax
Posté le 29-05-2013 à 11:55:40  profilanswer
 

Et bien effectivement, cela fonctionne parfaitement.
 
Mon problème venait du sort que j'utilisais et qui me faisait sortir les lignes commencant par 1 (par ex) après celles commençant par 13, 1145, 10204....    
 
De l'autre coté le join ne fonctionne pas avec un sort numerique.
 
En fait, le join prend un listing classé dictionnaire sur le premier caractere (1 puis 2 puis 3 ......) à l'interieur des lignes commencant par 1 (par ex) il faut que le tri soit numeric.
 
J'ai du ruser, mais avec ce tri, ton join fonctionne bien.
 
Merci à toi en tout cas !!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Requete croisée entre plusieurs tableaux (comme dans une DB)

 

Sujets relatifs
Faire la moyenne des données d'une colonne récupérées avec une requeteRécupérer des données dans plusieurs fichiers
Problème de "zéro" lors fusion plusieurs cellules[Résolu][Perl] Découper un fichier en plusieurs et optimisation
[Oracle 10G] UTL_FILE avec requête conséquenteRequête Sql - Trouver dates les plus proches
Aperçus de plusieurs sites dans une seule pageRequête SQL : Même occurence dans une colonne
Un Submit qui soit effectue une requete sql soit ouvre une pop up[Résolu] Tableau à plusieurs colonnes
Plus de sujets relatifs à : Requete croisée entre plusieurs tableaux (comme dans une DB)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR