Comment utiliser la commande join sous Linux

Si vous souhaitez fusionner les données de deux fichiers texte en faisant correspondre un champ commun, vous pouvez utiliser la commande de jointure Linux. 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, la commande Linux join peut vous sortir du bourbier.

Les fichiers de données

Toutes les données que nous utiliserons pour démontrer l’utilisation de la commande join sont fictives, en commençant par les deux fichiers suivants:

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

Le contenu de

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 du fichier-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

La commande join 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 que la jointure corresponde aux lignes entre les deux fichiers, chaque ligne doit contenir un champ commun.

  Comment envoyer un e-mail avec une adresse «De» différente dans Outlook

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 dans 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 faire 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.

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 associer doit être trié. Nous avons des nombres croissants dans les deux fichiers, nous remplissons donc ces critères. Par défaut, join utilise le premier champ d’un fichier, ce que nous voulons. Une autre valeur par défaut raisonnable est que la jointure s’attend à ce que les séparateurs de champs soient des espaces. Encore une fois, nous l’avons, afin que nous puissions aller de l’avant et lancer la jointure.

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

join file-1.txt file-2.txt

le

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.

  Comment utiliser la commande finger sous Linux

Champs non triés

Essayons quelque chose que nous savons ne fonctionnera pas. Nous mettrons les lignes dans un fichier dans le désordre afin que join ne puisse pas traiter le fichier correctement. Le contenu de fichier-3.txt est le même que celui de fichier-2.txt, mais la ligne huit se situe entre les lignes cinq et six.

Voici le contenu du fichier-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 joindre le fichier-3.txt au fichier-1.txt:

join file-1.txt file-3.txt

le

join signale que la septième ligne du fichier-3.txt est dans le désordre, elle n’est donc pas traitée. 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») a été la dernière traitée, nous en voyons donc la sortie.

Vous pouvez utiliser l’option –check-order si vous voulez voir si la jointure est satisfaite de l’ordre de tri d’un fichier – aucune fusion ne sera tentée.

Pour ce faire, nous tapons ce qui suit:

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

le

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 le fichier 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

le

La sortie répertorie sept lignes fusionnées.

L’option -a (print non appairable) indique à join d’imprimer également les lignes qui ne peuvent pas être mises en correspondance.

Ici, nous tapons la commande suivante pour indiquer à join d’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

le

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 pourrait ê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 le fichier-4.txt.

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

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

le

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

  Comment créer et imprimer une enveloppe dans Word

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 s’adapter à cela, nous pouvons utiliser les options -1 (fichier un champ) et -2 (fichier deux champ). 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 indiquer à join d’utiliser le premier champ dans le fichier un et le second dans le fichier deux:

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

le

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

Nous pouvons utiliser le -t (caractère de séparation) pour indiquer à 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

le

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 au fichier-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

Lorsque nous avons joint file-7.txt et file-8.txt, cela fonctionnait parfaitement. 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

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 l’option -i (ignorer la casse) pour forcer la jointure à ignorer ces différences et à faire correspondre les champs qui contiennent 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

le

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. Vous devez peut-être analyser les données, ou peut-être 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 de vous avoir rejoint dans votre coin!