# problème avec la commande "join"



## canari (7 Décembre 2006)

j'ai un problème avec la commande "join" sous OSX 10.3.9.
la commande suivante ne donne pas le résultat escompté:

join -a1 -a2 -e "xx" -1 1 -2 1 -t "|" toto1 toto2

ce qui donne =>
aa|defaa|11
ab|defab
ac|defac|22

or, le résultat devrait (à prriori) être =>
aa|defaa|11
ab|defab|xx
ac|defac|22

savez-vous comment arriver à ce résultat ?
la commande est-elle mal implémentée ou bien c'est moi qui me trompe ?

avec les fichiers:
toto1:
aa|defaa
ab|defab
ac|defac

toto2:
aa|11
ac|22


----------



## bompi (7 Décembre 2006)

D&#233;j&#224;, je peux te dire que c'est pareil sous 10.4.8


----------



## bompi (7 Décembre 2006)

1. Ta commande pourrait &#234;tre raccourcie (pas besoin de "-1 1 -2 1")
2. On dirait bien que l'option -e "xx" ne sert qu'&#224; remplir un champ vide, pas un champ qui n'existe pas ...

un exemple : ajoute un '|' &#224; la fin de la deuxi&#232;me ligne du fichier toto1 et tu verras que, ayant d&#233;fini un champ (gr&#226;ce au _pipe_) vide tu auras "xx". Sans le _pipe_, le champ n'est pas d&#233;fini sur la ligne, ce qui est tr&#232;s diff&#233;rent.


----------



## canari (8 Décembre 2006)

c'est peut-être moi qui ai mal compris l'option "-e", mais mon fichier d'exemple est correct, je ne vais pas rajouter un | en fin d'une ligne, ce serait "idiot".
c'est juste que l'entrée ab n'est pas présente dans toto2 et je pensais que l'option "-e" permettait (avec l'option -a1) d'avoir le même nb de champs en sortie (c'est justement là que je me demande si je comprends bien cette option ou non).
c'est sûr qu'ici "-1 1 -2 1" est inutile, mais c'est parce que j'ai modifié ma vraie commande qui porte sur d'autres fichiers où le critère de jointure n'est pas en 1ère position.


----------



## canari (8 Décembre 2006)

après pas mal de recherche, j'ai lu qu'il fallait utiliser l'option -o conjointement avec l'option -e.
j'ai donc essayé la commande:
join -a1 -e "xxx" -t "|" -o 1.1 1.2 2.1 toto1 toto2
=>
aa|defaa|aa
ab|defab
ac|defac|ac

le résultat n'est donc pas meilleur et il s'avère que la commande join sous osx n'est pas bonne.

j'ai donc compilé le code source d'un join.c que j'ai trouvé et le résultat est bon:
./mon_join -a1 -e "xxx" -t "|" -o 1.1 1.2 2.1 toto1 toto2
=>
aa|defaa|aa
ab|defab|xxx
ac|defac|ac

si quelqu'un sait où envoyer un mail (chez apple) pour leur signaler le pb, j'ai bien cherché mais je n'ai rien trouvé même dans l'ADC.


----------



## Zeusviper (8 Décembre 2006)

canari a dit:


> si quelqu'un sait où envoyer un mail (chez apple) pour leur signaler le pb, j'ai bien cherché mais je n'ai rien trouvé même dans l'ADC.



http://bugreport.apple.com/ 

bonne soumission!


----------



## canari (9 Décembre 2006)

Zeusviper a dit:


> http://bugreport.apple.com/
> 
> bonne soumission!


merci, j'ai soumis le pb, on verra bien.
euh, tu crois qu'ils "s'en foutent" ?
pour &#234;tre vraiment s&#251;r, je pr&#233;f&#232;rerais leur version corrig&#233;e, mais celle que j'ai compil&#233; remplit bien son r&#244;le.


----------



## canari (9 Décembre 2006)

bompi a dit:


> Déjà, je peux te dire que c'est pareil sous 10.4.8


peux-tu réessayer mais avec la bonne commande (j'avais oublié l'option -o):
join -a1 -e "xxx" -t "|" -o 1.1 1.2 2.1 toto1 toto2
il semblerait que la commande soit bonne sous 10.4.8 (mais pas ma version sous 10.3.9)


----------



## bompi (9 Décembre 2006)

&#199;a marche, sous r&#233;serve d'ajouter des virgules pour l'option -o : 
	
	



```
join -a1 -e "xxx" -t "|" -o 1.1,1.2,2.1 toto1 toto2
```


----------

