problème avec la commande "join"

canari

Membre confirmé
14 Juillet 2004
73
2
56
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
 
Déjà, je peux te dire que c'est pareil sous 10.4.8
 
1. Ta commande pourrait être raccourcie (pas besoin de "-1 1 -2 1")
2. On dirait bien que l'option -e "xx" ne sert qu'à remplir un champ vide, pas un champ qui n'existe pas ...

un exemple : ajoute un '|' à la fin de la deuxième ligne du fichier toto1 et tu verras que, ayant défini un champ (grâce au pipe) vide tu auras "xx". Sans le pipe, le champ n'est pas défini sur la ligne, ce qui est très différent.
 
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.
 
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.
 
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)
 
Ça marche, sous réserve d'ajouter des virgules pour l'option -o :
Bloc de code:
join -a1 -e "xxx" -t "|" -o 1.1,1.2,2.1 toto1 toto2