Joindre, remplir les valeurs keys manquantes

J'ai deux files ayant une valeur de key primaire en tant que premier champ et une ou des valeurs correspondantes en tant que champs restants et certaines valeurs de key primaire sont manquantes dans l'un d'eux mais sont présents dans un autre et vice versa:

$ cat jointest1.txt jointest2.txt a 1 b 2 d 4 e 5 a 10 b 11 c 12 d 13 

Je m'attendrais à une sortie qui fusionne ces files en fonction d'une key primaire, en substituant les valeurs manquantes ou non, comme:

 $ joinmerge jointest1.txt jointest2.txt a 1 10 b 2 11 c - 12 d 4 13 e 5 - 

La possibilité de replace les valeurs manquantes par des tirets ou quelque chose est facultative.

J'ai essayé de join , mais il indique que mes files ne sont pas correctement sortingés:

 $ join jointest1.txt jointest2.txt a 1 10 b 2 11 join: file 2 is not in sorted order d 4 13 

Quelle command devrais-je utiliser à la place?

Quelle implémentation de join utilisez-vous? Avec join (GNU coreutils) 5.97 , je peux utiliser

 [0 1021] ~/temp/jointest % join -a1 -a2 jointest1.txt jointest2.txt a 1 10 b 2 11 c 12 d 4 13 e 5 

et la "plaine" jointe fonctionne aussi (mais omet c et e). Il y a une option -e qui vous permet de choisir le marqueur pour les champs vides, mais il semble être cassé dans ma version et ne remplit que le cas e, pas le cas c.

Essayez ce qui suit:

 > join -e- -a1 -a2 jointest1 -o 0 1.1 1.2 2.1 2.2 jointest2 aa 1 a 10 bb 2 b 11 c - - c 12 dd 4 d 13 ee 5 - - 

ou

 > join -e- -a1 -a2 jointest1 -o 0 1.2 2.2 jointest2 a 1 10 b 2 11 c - 12 d 4 13 e 5 - 

Je ne sais pas si / comment il est possible de réaliser la même chose sans l'option -o. L'option -o indique: d'abord imprimer le champ de jointure, puis le champ no. 2 du file 1, puis le champ 2 du file 2. Vous devez connaître le format des files pour get le fonctionnement des champs vides.

J'ai écrit un outil perl pour exactement cette key, problème de valeur:

Associer les bonnes lignes: n'importe quel nombre de files . Il est également disponible via GitHub .

Pour l'exécuter, vous tapez:

 merge -k -e "-" jointest1.txt jointest2.txt