Apprendre les commandes Linux : join
Introduction
La commande join est encore un autre exemple d’utilitaire de traitement de texte sous GNU/Linux. La commande Join combine deux fichiers en fonction des lignes de contenu correspondantes trouvées dans chaque fichier. L’utilisation de la commande join est assez simple et, si elle est utilisée actuellement et dans la bonne situation, elle peut économiser beaucoup de temps et d’efforts. Cet article nécessite une expérience de base de la ligne de commande.
Options fréquemment utilisées
- -1 CHAMP
Jointure sur le champ spécifié trouvé dans le fichier 1 - -2 CHAMP
Jointure sur le champ spécifié trouvé dans le fichier 2 - -t CHAR
Utiliser CHAR comme séparateur d’entrée et de sortie
Notions de base
L’utilisation de base de la commande join est une utilisation sans aucune option. Tout ce qui est requis est de spécifier 2 fichiers en arguments. Supposons que nous ayons deux fichiers A.txt et B.txt avec le contenu suivant :
cat A.txt
1 A
2 B
3 C
cat B.txt
1 John
2 Linda
3 Rares
Ici, nous pouvons voir que le premier champ est un candidat parfait pour effectuer une opération de jointure. Par défaut, la commande join effectuera une opération de jointure sur un premier FIELD où le séparateur de champ est un caractère d’espace unique ou TAB. Par conséquent, en exécutant une commande linux suivante, nos deux fichiers sont joints sur la base du CHAMP 1 :
join A.txt B.txt
1 A John
2 B Linda
3 C Rares
Choisir FIELD
Dans notre exemple précédent, vous pouvez voir une fonction par défaut d’une commande join. Dans cette section, nous allons voir comment nous pouvons spécifier différents champs sur lesquels la commande join doit effectuer une opération de jointure. Considérons une A.txt suivante et B.txt fichiers :
cat A.txt
John A 1
Linda B 2
Rares C 3
cat B.txt
1 A
2 B
3 C
Comme nous pouvons le voir, dans ce cas, nous la première jointure par défaut FIELD n’est plus la correspondance. Par conséquent, l’exécution d’une commande de jointure sur ces deux fichiers ne produira aucune sortie. Cependant, nous pouvons également voir que le deuxième champ du premier fichier correspond au deuxième champ du deuxième fichier. En conséquence, nous pouvons modifier le comportement par défaut de la commande join et joindre les deux fichiers en fonction du deuxième CHAMP dans chaque fichier :
join -1 2 -2 2 A.txt B.txt
A John 1 1
B Linda 2 2
C Rares 3 3
où -1 est un premier fichier et 2 est un deuxième CHAMP et -2 est un deuxième fichier et 2 est une deuxième colonne. Dans ce cas, ce n’est pas parce que les deux champs correspondants sont deuxièmes que nous pouvons utiliser -j comme raccourci.
join -j 2 A.txt B.txt
A John 1 1
B Linda 2 2
C Rares 3 3
Comme vous l’avez déjà remarqué, un troisième FIELD et le premier FIELD dans les deux fichiers peuvent également être utilisés pour une opération de jointure.
join -1 2 -2 2 A.txt B.txt
A John 1 1
B Linda 2 2
C Rares 3 3
join -1 3 -2 1 A.txt B.txt
1 John A A
2 Linda B B
3 Rares C C
Il est important de noter dans les derniers exemples que la commande join affichera toujours le FIELD correspondant en premier.
Choix du délimiteur FIELD
Eh bien, tous les fichiers ne sont pas correctement formatés pour une opération de commande de jointure. Comme mentionné précédemment, le délimiteur FIELD par défaut est l’espace. Mais que se passe-t-il si nous avons « , " ( virgule ) ou même TAB comme délimiteur ? Considérons les fichiers suivants :
cat A.txt
John,A,1
Linda,B,2
Rares,C,3
cat B.txt
1,A
2,B
3,C
Dans ce cas, la seule différence par rapport aux exemples précédents est que le séparateur FIELD est « , « . Pour indiquer à la commande join quel séparateur FIELD utiliser, nous pouvons profiter de l’option -t, mais la syntaxe est la même :
join -t, -1 3 -2 1 A.txt B.txt
1,John,A,A
2,Linda,B,B
3,Rares,C,C
Plusieurs espaces
Si vos fichiers ont plusieurs espaces en tant que délimiteur FIELD, l’option la plus sûre est de les convertir en un seul délimiteur d’espace. Par exemple, la connexion de ces fichiers peut être assez difficile :
cat A.txt
John A 1
Linda B 2
Rares C 3
cat B.txt
1 A
2 B
3 C
Par conséquent, si la situation vous le permet, vous pouvez le convertir en un seul fichier délimité par des espaces à l’aide de la commande sed :
sed -i 's/\s\+/ /g' A.txt
sed -i 's/\s\+/ /g' B.txt
cat A.txt B.txt
John A 1
Linda B 2
Rares C 3
1 A
2 B
3 C
Tab un délimiteur FIELD
Le délimiteur de tabulation est également accepté par la commande join par défaut. Par conséquent, l’exemple suivant effectuera une opération de jointure valide :
cat A.txt B.txt
John A 1
Linda B 2
Rares C 3
1 A
2 B
3 C
join -1 3 -2 1 A.txt B.txt
1 John A A
2 Linda B B
3 Rares C C
Ignorer la casse
Si votre FIELD correspondant est dans un ordre parfait, mais que les FIELDS des deux fichiers ont des différences en majuscules et en minuscules, la jointure n’effectuera pas d’opération de jointure valide et ignorera les lignes non correspondantes à moins que -i ( ignorer la casse ) ne soit utilisé. Notez le b minuscule suivant dans l’exemple suivant :
cat A.txt B.txt
John A 1
Linda b 2
Rares C 3
1 A
2 B
3 C
join -1 2 -2 2 A.txt B.txt
A John 1 1
C Rares 3 3
join -i -1 2 -2 2 A.txt B.txt
A John 1 1
b Linda 2 2
C Rares 3 3
Remplacement du format de jointure par défaut
Dans l’exemple suivant, nous allons voir comment nous pouvons remplacer un comportement de format de commande de jointure par défaut avec l’option -o. Considérons une sortie de jointure de fichiers A.txt et B.txt :
cat A.txt B.txt
John A 1
Linda B 2
Rares C 3
1 A
2 B
3 C
join -1 2 -2 2 A.txt B.txt
A John 1 1
B Linda 2 2
C Rares 3 3
Le champ de jointure est imprimé en premier. Que se passe-t-il si nous ne voulons pas du tout imprimer le champ de jointure ou si nous voulons imprimer le champ joint dans un ordre différent. Dans ce cas, l’option -o FORMAT devient très pratique. Dans cet exemple, nous n’afficherons que les champs correspondants :
- Premier champ du premier fichier : 1.1
- Premier champ du deuxième fichier : 2.1
join -o 1.1 2.1 -1 2 -2 2 A.txt B.txt
John 1
Linda 2
Rares 3
Lignes non appariables
Par défaut, seules les lignes appariables sont imprimées par la commande join. -une option indique à la commande join d’inclure également les lignes non correspondantes. Dans l’exemple suivant, nous allons imprimer toutes les lignes non correspondantes dans le fichier 1.
cat A.txt B.txt
John A 1
Linda B 2
Rares C 3
Lubos D 4
1 A
2 B
3 C
5 E
join -a 1 -o 1.1 2.1 -1 2 -2 2 A.txt B.txt
John 1
Linda 2
Rares 3
Lubos
Ou nous imprimons toutes les lignes non appariables des deux fichiers en :
join -a 1 -a 2 -o 1.1 2.1 -1 2 -2 2 A.txt B.txt
John 1
Linda 2
Rares 3
Lubos
5