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

Requete croisée entre plusieurs tableaux (comme dans une DB) - Shell/Batch - Programmation

Marsh Posté le 25-05-2013 à 09:52:12    

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 !
 

Reply

Marsh Posté le 25-05-2013 à 09:52:12   

Reply

Marsh Posté le 25-05-2013 à 12:32:18    

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
Reply

Marsh Posté le 27-05-2013 à 17:04:58    

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
Reply

Marsh Posté le 27-05-2013 à 23:41:56    

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.


Reply

Marsh Posté le 29-05-2013 à 11:55:40    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed