Comment utiliser la commande join sous Linux

Une invite de terminal prête pour une commande sur un système Linux.

Si vous souhaitez fusionner les données de deux fichiers texte en faisant correspondre un champ commun, vous pouvez utiliser le Linux join commander. Il ajoute une pincée de dynamisme à vos fichiers de données statiques. Nous allons vous montrer comment l’utiliser.

Mise en correspondance des données entre les fichiers

Les données sont roi. Les entreprises, les entreprises et les ménages fonctionnent avec lui. Mais les données stockées dans différents fichiers et rassemblées par différentes personnes sont pénibles. En plus de savoir quels fichiers ouvrir pour trouver les informations souhaitées, la mise en page et le format des fichiers sont susceptibles d’être différents.

Vous devez également faire face au casse-tête administratif de quels fichiers doivent être mis à jour, qui doivent être sauvegardés, qui sont hérités et qui peuvent être archivés.

De plus, si vous avez besoin de consolider vos données ou d’effectuer une analyse sur un ensemble de données complet, vous avez un problème supplémentaire. Comment rationalisez-vous les données dans les différents fichiers avant de pouvoir faire ce que vous devez en faire? Comment abordez-vous la phase de préparation des données?

La bonne nouvelle est que si les fichiers partagent au moins un élément de données commun, le Linux join commande peut vous sortir de la boue.

Les fichiers de données

Toutes les données que nous utiliserons pour démontrer l’utilisation du join La commande est fictive, commençant par les deux fichiers suivants:

cat file-1.txt
cat file-2.txt

Le contenu de "cat file-1.txt" et "cat file-2.txt" dans une fenêtre de terminal.

Voici le contenu de file-1.txt:

1 Adore Varian [email protected] Female 192.57.150.231
2 Nancee Merrell [email protected] Female 22.198.121.181
3 Herta Friett [email protected] Female 33.167.32.89
4 Torie Venmore [email protected] Female 251.9.204.115
5 Deni Sealeaf [email protected] Female 210.53.81.212
6 Fidel Bezley [email protected] Male 72.173.218.75
7 Ulrikaumeko Standen [email protected] Female 4.204.0.237
8 Odell Jursch [email protected] Male 1.138.85.117

Nous avons un ensemble de lignes numérotées, et chaque ligne contient toutes les informations suivantes:

  • Un numéro
  • Un prénom
  • Un nom de famille
  • Une adresse e-mail
  • Le sexe de la personne
  • Une adresse IP

Voici le contenu de file-2.txt:

1 Varian [email protected] Female Western New York $535,304.73
2 Merrell [email protected] Female Finger Lakes $309,033.10
3 Friett [email protected] Female Southern Tier $461,664.44
4 Venmore [email protected] Female Central New York $175,818.02
5 Sealeaf [email protected] Female North Country $126,690.15
6 Bezley [email protected] Male Mohawk Valley $366,733.78
7 Standen [email protected] Female Capital District $674,634.93
8 Jursch [email protected] Male Hudson Valley $663,821.09

Chaque ligne dans file-2.txt contient les informations suivantes:

  • Un numéro
  • Un nom de famille
  • Une adresse e-mail
  • Le sexe de la personne
  • Une région de New York
  • Une valeur monétaire

le join La commande fonctionne avec des «champs», ce qui, dans ce contexte, signifie une section de texte entourée d’espaces, le début d’une ligne ou la fin d’une ligne. Pour join pour faire correspondre les lignes entre les deux fichiers, chaque ligne doit contenir un champ commun.

Par conséquent, nous ne pouvons faire correspondre un champ que s’il apparaît dans les deux fichiers. L’adresse IP n’apparaît que dans un seul fichier, donc ce n’est pas bon. Le prénom n’apparaît que dans un seul fichier, nous ne pouvons donc pas l’utiliser non plus. Le nom de famille est dans les deux fichiers, mais ce serait un mauvais choix, car différentes personnes ont le même nom de famille.

Vous ne pouvez pas non plus lier les données aux entrées masculines et féminines, car elles sont trop vagues. Les régions de New York et les valeurs en dollars n’apparaissent que dans un seul fichier également.

Cependant, nous pouvons utiliser l’adresse e-mail car elle est présente dans les deux fichiers, et chacun est unique à un individu. Un rapide coup d’œil à travers les fichiers confirme également que les lignes de chacune correspondent à la même personne, nous pouvons donc utiliser les numéros de ligne comme champ pour correspondre (nous utiliserons un champ différent plus tard).

Notez qu’il y a un nombre différent de champs dans les deux fichiers, ce qui est très bien – nous pouvons dire join quel champ utiliser pour chaque fichier.

En relation :  Le nouveau terminal Windows de Microsoft est maintenant disponible

Cependant, faites attention aux domaines comme les régions de New York; dans un fichier séparé par des espaces, chaque mot du nom d’une région ressemble à un champ. Étant donné que certaines régions ont des noms de deux ou trois mots, vous avez en fait un nombre différent de champs dans le même fichier. Ce n’est pas grave, tant que vous correspondez aux champs qui apparaissent dans la ligne avant les régions de New York.

La commande join

Tout d’abord, le champ que vous allez faire correspondre doit être trié. Nous avons des nombres croissants dans les deux fichiers, nous répondons donc à ces critères. Par défaut, join utilise le premier champ d’un fichier, ce que nous voulons. Un autre défaut raisonnable est que join s’attend à ce que les séparateurs de champ soient des espaces. Encore une fois, nous l’avons, donc nous pouvons aller de l’avant et allumer join.

Comme nous utilisons toutes les valeurs par défaut, notre commande est simple:

join file-1.txt file-2.txt

La commande "join file-1.txt file-2.txt" dans une fenêtre de terminal.

join considère que les fichiers sont «fichier un» et «fichier deux» selon l’ordre dans lequel ils sont répertoriés sur la ligne de commande.

La sortie est la suivante:

1 Adore Varian [email protected] Female 192.57.150.231 Varian [email protected] Female Western New York $535,304.73
2 Nancee Merrell [email protected] Female 22.198.121.181 Merrell [email protected] Female Finger Lakes $309,033.10
3 Herta Friett [email protected] Female 33.167.32.89 Friett [email protected] Female Southern Tier $461,664.44
4 Torie Venmore [email protected] Female 251.9.204.115 Venmore [email protected] Female Central New York $175,818.02
5 Deni Sealeaf [email protected] Female 210.53.81.212 Sealeaf [email protected] Female North Country $126,690.15
6 Fidel Bezley [email protected] Male 72.173.218.75 Bezley [email protected] Male Mohawk Valley $366,733.78
7 Ulrikaumeko Standen [email protected] Female 4.204.0.237 Standen [email protected] Female Capital District $674,634.93
8 Odell Jursch [email protected] Male 1.138.85.117 Jursch [email protected] Male Hudson Valley $663,821.09

La sortie est formatée de la manière suivante: Le champ sur lequel les lignes ont été mises en correspondance est imprimé en premier, suivi des autres champs du fichier un, puis des champs du fichier deux sans le champ de correspondance.

Champs non triés

Essayons quelque chose que nous savons ne fonctionnera pas. Nous allons mettre les lignes dans un fichier dans le désordre, donc join ne pourra pas traiter correctement le fichier. Le contenu de file-3.txt sont les mêmes que file-2.txt, mais la ligne huit est entre les lignes cinq et six.

Voici le contenu de file-3.txt:

1 Varian [email protected] Female Western New York $535,304.73
2 Merrell [email protected] Female Finger Lakes $309,033.10
3 Friett [email protected] Female Southern Tier $461,664.44
4 Venmore [email protected] Female Central New York $175,818.02
5 Sealeaf [email protected] Female North Country $126,690.15
8 Jursch [email protected] Male Hudson Valley $663,821.09
6 Bezley [email protected] Male Mohawk Valley $366,733.78
7 Standen [email protected] Female Capital District $674,634.93

Nous tapons la commande suivante pour essayer de rejoindre file-3.txtà file-1.txt:

join file-1.txt file-3.txt

La commande "join file-1.txt file-3.txt" dans une fenêtre de terminal.

join rapporte que la septième ligne de file-3.txt est en panne, il n’est donc pas traité. La ligne sept est celle qui commence par le numéro six, qui doit venir avant huit dans une liste correctement triée. La sixième ligne du fichier (qui commence par «8 Odell») était la dernière traitée, nous en voyons donc la sortie.

Vous pouvez utiliser le --check-order option si vous voulez voir si join est satisfait de l’ordre de tri des fichiers – aucune fusion ne sera tentée.

Pour ce faire, nous tapons ce qui suit:

join --check-order file-1.txt file-3.txt

La commande "join --check-order file-1.txt file-3.txt" dans une fenêtre de terminal.

join vous indique à l’avance qu’il y aura un problème avec la ligne sept du fichier file-3.txt.

Fichiers avec des lignes manquantes

Dans file-4.txt, la dernière ligne a été supprimée, il n’y a donc pas de ligne huit. Le contenu est le suivant:

1 Varian [email protected] Female Western New York $535,304.73
2 Merrell [email protected] Female Finger Lakes $309,033.10
3 Friett [email protected] Female Southern Tier $461,664.44
4 Venmore [email protected] Female Central New York $175,818.02
5 Sealeaf [email protected] Female North Country $126,690.15
6 Bezley [email protected] Male Mohawk Valley $366,733.78
7 Standen [email protected] Female Capital District $674,634.93

Nous tapons ce qui suit et, étonnamment, join ne se plaint pas et traite toutes les lignes qu’il peut:

join file-1.txt file-4.txt

La commande "join file-1.txt file-4.txt" dans une fenêtre de terminal.

La sortie répertorie sept lignes fusionnées.

le -a (impression non appariable) indique join pour imprimer également les lignes qui ne peuvent pas être mises en correspondance.

En relation :  Qu'est-ce que mshelper? Comment diagnostiquer et supprimer ce logiciel malveillant Mac

Ici, nous tapons la commande suivante pour dire join pour imprimer les lignes du fichier un qui ne peuvent pas être mises en correspondance avec les lignes du fichier deux:

join -a 1 file-1.txt file-4.txt

La commande "join -a 1 file-1.txt file-4.txt" dans une fenêtre de terminal.

Sept lignes correspondent et la huitième ligne du fichier un est imprimée, sans correspondance. Il n’y a pas d’informations fusionnées car file-4.txt ne contenait pas de ligne huit à laquelle il pouvait être mis en correspondance. Cependant, au moins, il apparaît toujours dans la sortie, vous savez donc qu’il n’a pas de correspondance dans file-4.txt.

Nous tapons ce qui suit -v (supprimer les lignes jointes) pour révéler toutes les lignes qui n’ont pas de correspondance:

join -v file-1.txt file-4.txt

La commande "join -v file-1.txt file-4.txt" dans une fenêtre de terminal.

Nous voyons que la ligne huit est la seule qui n’a pas de correspondance dans le fichier deux.

Correspondance avec d’autres champs

Associons deux nouveaux fichiers sur un champ qui n’est pas celui par défaut (champ un). Voici le contenu du fichier-7.txt:

[email protected] Female 192.57.150.231
[email protected] Female 210.53.81.212
[email protected] Male 72.173.218.75
[email protected] Female 33.167.32.89
[email protected] Female 22.198.121.181
[email protected] Male 1.138.85.117
[email protected] Female 251.9.204.115
[email protected] Female 4.204.0.237

Et voici le contenu du fichier-8.txt:

Female [email protected] Western New York $535,304.73
Female [email protected] North Country $126,690.15
Male [email protected] Mohawk Valley $366,733.78
Female [email protected] Southern Tier $461,664.44
Female [email protected] Finger Lakes $309,033.10
Male [email protected] Hudson Valley $663,821.09
Female [email protected] Central New York $175,818.02
Female [email protected] Capital District $674,634.93

Le seul champ sensible à utiliser pour rejoindre est l’adresse e-mail, qui est le champ un dans le premier fichier et le champ deux dans le second. Pour accommoder cela, nous pouvons utiliser le -1 (classer un champ) et -2 (fichier deux champs) options. Nous les suivrons avec un numéro qui indique quel champ de chaque fichier doit être utilisé pour la jointure.

Nous tapons ce qui suit pour dire join pour utiliser le premier champ du fichier un et le second du fichier deux:

join -1 1 -2 2 file-7.txt file-8.txt

La commande "join -1 1 -2 2 file-7.txt file-8.txt" dans une fenêtre de terminal.

Les fichiers sont joints sur l’adresse e-mail, qui s’affiche comme premier champ de chaque ligne dans la sortie.

Utilisation de différents séparateurs de champ

Que faire si vous avez des fichiers avec des champs séparés par autre chose que des espaces?

Les deux fichiers suivants sont séparés par des virgules. Le seul espace se trouve entre les noms de lieux composés de plusieurs mots:

cat file-5.txt
cat file-6.txt

Le contenu de "cat file-5.txt" et "cat file-6.txt" dans une fenêtre de terminal.

Nous pouvons utiliser le -t (caractère séparateur) pour dire join quel caractère utiliser comme séparateur de champ. Dans ce cas, c’est la virgule, nous tapons donc la commande suivante:

join -t, file-5.txt file-6.txt

La commande "join -t, file-5.txt file-6.txt" dans une fenêtre de terminal.

Toutes les lignes sont mises en correspondance et les espaces sont conservés dans les noms de lieux.

Ignorer la casse des lettres

Un autre fichier, file-9.txt, est presque identique à file-8.txt. La seule différence est que certaines des adresses e-mail ont une lettre majuscule, comme indiqué ci-dessous:

Female [email protected] Western New York $535,304.73
Female [email protected] North Country $126,690.15
Male [email protected] Mohawk Valley $366,733.78
Female [email protected] Southern Tier $461,664.44
Female [email protected] Finger Lakes $309,033.10
Male [email protected] Hudson Valley $663,821.09
Female [email protected] Central New York $175,818.02
Female [email protected] Capital District $674,634.93

Quand nous avons rejoint file-7.txt et file-8.txt, cela a parfaitement fonctionné. Voyons ce qui se passe avec file-7.txt et file-9.txt.

Nous tapons la commande suivante:

join -1 1 -2 2 file-7.txt file-9.txt

Le "join -1 1 -2 2 file-7.txt file-9.txt" dans une fenêtre de terminal.

Nous n’avons fait correspondre que six lignes. Les différences entre les lettres majuscules et minuscules ont empêché les deux autres adresses e-mail d’être jointes.

Cependant, nous pouvons utiliser le -i (ignorer la casse) option pour forcer join pour ignorer ces différences et faire correspondre les champs contenant le même texte, quelle que soit la casse.

Nous tapons la commande suivante:

join -1 1 -2 2 -i file-7.txt file-9.txt

La commande "join -1 1 -2 2 -i fichier-7.txt fichier-9.txt" dans une fenêtre de terminal.

Les huit lignes sont mises en correspondance et jointes avec succès.

Mélanger et assortir

Dans join, vous avez un allié puissant lorsque vous vous débattez avec une préparation de données délicate. Peut-être avez-vous besoin d’analyser les données ou essayez-vous de les mettre en forme pour effectuer une importation vers un système différent.

Quelle que soit la situation, vous serez heureux d’avoir join dans ton coin!

Moyens Staff
Moyens I/O Staff vous a motivé, donner des conseils sur la technologie, le développement personnel, le style de vie et des stratégies qui vous aider.