UNIX Full Outer Join crée des éléments d’entrées en double malgré un ordre correct? Serait-ce les articles non appariés créant le désordre?

J’ai deux fichiers que je veux rejoindre en fonction de leur première colonne.

Ils sont sortingés et toutes les valeurs de la première colonne de FILE1 ne se trouvent pas dans FILE2 et vice versa.

FILE1.TXT ressemble à quelque chose comme ça, sauf que c’est environ 15k lignes:

snRNA:7SK 1037 snRNA:U11 144 snRNA:U1:21D 348.293 snRNA:U12:73B 16 snRNA:U1:82Eb 2.14286 snRNA:U1:95Ca 348.293 snRNA:U1:95Cb 351.96 snRNA:U1:95Cc 35.5095 snRNA:U2:14B 447.35 snRNA:U2:34ABa 459.75 snRNA:U2:34ABb 513.25 snRNA:U2:34ABc 509 snRNA:U2:38ABa 443.65 snRNA:U4:38AB 155 snRNA:U4:39B 611.833 snRNA:U4atac:82E 152.5 snRNA:U5:14B 1 snRNA:U5:23D 2.5 snRNA:U5:34A 11 snRNA:U5:38ABb 2.5 snRNA:U5:63BC 44 snRNA:U6:96Aa 18 snRNA:U6:96Ab 9.5 snRNA:U6:96Ac 8.5 snRNA:U7 4 snRNA:U8 8 

FILE2.TXT ressemble à ceci, c’est aussi ~ 15K lignes:

 snRNA:7SK 1259 snRNA:U11 33 snRNA:U1:21D 1480.57 snRNA:U12:73B 4 snRNA:U1:82Eb 10.2 snRNA:U1:95Ca 1480.57 snRNA:U1:95Cb 1484.03 snRNA:U1:95Cc 114.633 snRNA:U2:14B 4678.89 snRNA:U2:34ABa 4789.93 snRNA:U2:34ABb 5292.22 snRNA:U2:34ABc 5273.23 snRNA:U2:38ABa 4557.88 snRNA:U2:38ABb 3.75 snRNA:U4:38AB 405 snRNA:U4:39B 1503.5 snRNA:U4atac:82E 548 snRNA:U5:14B 25 snRNA:U5:23D 19 snRNA:U5:34A 32 snRNA:U5:38ABb 4 snRNA:U5:63BC 742 snRNA:U6:96Aa 39.5 snRNA:U6:96Ab 1 snRNA:U6:96Ac 1 snRNA:U7 11 

Comme vous pouvez le voir, un élément de FILE2 (snRNA: U5: 38ABb) est manquant IN FILE1 et un élément de FILE1 est manquant dans FILE2. C’est le cas tout au long des fichiers, dans les deux directions et à plusieurs resockets.

J’écris la commande comme suit:

 join -a1 -a2 -e "0" -1 1 -2 1 -o '0,1.2,2.2' -t ' ' FILE1.TXT FILE2.TXT >JOIN_FILE.TXT 

Si j’essaie la commande avec UNIQUEMENT la vingtaine de lignes que j’ai collées depuis chaque fichier, cela fonctionne comme il se doit.

Mais quand je l’exécute sur la totalité des fichiers, la sortie est terrible et je ne comprends pas pourquoi. Les deux fichiers ont été sortingés en utilisant le sort -k1,1 , donc même si certaines lignes de 1 ne sont pas dans 2 et vice versa, elles sont toutes les deux dans le même ordre.

Ce que je reçois, ce sont des entrées en double pour un élément, telles que: (encore une fois, je ne montre qu’une fraction du fichier de sortie …)

 snRNA:7SK 0 1037 snRNA:U11 0 144 snRNA:U1:21D 0 348.293 snRNA:U12:73B 0 16 snRNA:U1:82Eb 0 2.14286 snRNA:U1:95Ca 0 348.293 snRNA:U1:95Cb 0 351.96 snRNA:U1:95Cc 0 35.5095 snRNA:U2:14B 0 447.35 snRNA:U2:34ABa 0 459.75 snRNA:U2:34ABb 0 513.25 snRNA:U2:34ABc 0 509 snRNA:U2:38ABa 0 443.65 snRNA:U4:38AB 0 155 snRNA:U4:39B 0 611.833 snRNA:U4atac:82E 0 152.5 snRNA:U5:14B 0 1 snRNA:U5:23D 0 2.5 snRNA:U5:34A 0 11 snRNA:U5:38ABb 0 2.5 snRNA:U5:63BC 0 44 snRNA:U6:96Aa 0 18 snRNA:U6:96Ab 0 9.5 snRNA:U6:96Ac 0 8.5 snRNA:U7 0 4 snRNA:7SK 1259 0 snRNA:U11 33 0 snRNA:U1:21D 1480.57 0 snRNA:U12:73B 4 0 snRNA:U1:82Eb 10.2 0 snRNA:U1:95Ca 1480.57 0 snRNA:U1:95Cb 1484.03 0 snRNA:U1:95Cc 114.633 0 snRNA:U2:14B 4678.89 0 snRNA:U2:34ABa 4789.93 0 snRNA:U2:34ABb 5292.22 0 snRNA:U2:34ABc 5273.23 0 snRNA:U2:38ABa 4557.88 0 snRNA:U2:38ABb 3.75 0 snRNA:U4:38AB 405 0 snRNA:U4:39B 1503.5 0 snRNA:U4atac:82E 548 0 snRNA:U5:14B 25 0 snRNA:U5:23D 19 0 snRNA:U5:34A 32 0 snRNA:U5:38ABb 4 0 snRNA:U5:63BC 742 0 snRNA:U6:96Aa 39.5 0 snRNA:U6:96Ab 1 0 snRNA:U6:96Ac 1 0 snRNA:U7 11 0 

En principe, tout a été dupliqué, avec une ligne pour la valeur dans FILE1 et une autre ligne pour la valeur dans FILE2. Cela pourrait-il être dû aux différences accumulées entre les fichiers (c.-à-d., Toutes les entrées non appariées avant ces fichiers spécifiques?) Cet embrouillage de la sortie s’exécute tout au long du fichier.

Qu’est-ce que je fais mal? Est-ce que je ne spécifie pas que les entrées dans les deux fichiers ne correspondent pas toujours?

Est-ce qu’il y a un moyen de résoudre ceci?

Merci beaucoup! Carmen

Modifier:

Voici les 15 premières lignes de chaque fichier, afin de montrer que l’ordre est le même dans les deux, mais les choses commencent à être différentes car les éléments de FILE1 commencent à apparaître et ne sont pas dans FILE2, et vice versa. Je me demande si c’est ce qui cause la confusion.

 ==> FILE1  FILE2 <== 128up 80 140up 19 14-3-3epsilon 1718 14-3-3zeta 5554 18w 213 26-29-p 200 2mit 680.786 312 33 4EHP 1838.44 5-HT1A 303 5-HT1B 42 5-HT2 553.65 5-HT7 348.5 5PtaseI 105 5S_DM 46054.4 

Il est possible que vous ayez des “espaces” au lieu de “tabs” dans l’un de vos fichiers.

Votre commande de jointure semble donner des entrées en double lorsqu’il y a un espace dans l’une des lignes:

 #> bash fjoin.sh :: join :: join: s.file1s.txt:2: is not sorted: 128up 139 :: diff :: 1c1,3 < 128up 139 80 --- > 128up 0 80 > 128up 139 0 0 > 128up 139 0 #> grep " " file*txt file1s.txt:128up 139 #> grep 128up file1s.txt 128up 139 128up 139 

fjoin.sh

 #!/bin/bash f1="file1.txt" f1s="file1s.txt" f2="file2.txt" # sort files & remove duplicate sort -k 1b,1 ${f1} | uniq > s.${f1} sort -k 1b,1 ${f1s} | uniq > s.${f1s} sort -k 1b,1 ${f2} | uniq > s.${f2} echo ":: join ::" join -a1 -a2 -e "0" -1 1 -2 1 -o '0,1.2,2.2' -t ' ' s.${f1} s.${f2} > joined-1_f1_f2.txt join -a1 -a2 -e "0" -1 1 -2 1 -o '0,1.2,2.2' -t ' ' s.${f1s} s.${f2} > joined-2_f1_f2.txt echo " " echo ":: diff ::" diff joined-1_f1_f2.txt joined-2_f1_f2.txt 

mettre à jour

Définir LC_ALL=C comme suggéré par Pierre pourrait aider.

Il y a moins de différences après l’ajout de l’ export LC_ALL=C à fjoin.sh:

 #> bash fjoin.sh :: join :: :: diff :: 1a2 > 128up 139 0 0