Fatmawati Achmad Zaenuri / Shutterstock
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 en font autant. 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
Voici le contenu de file-1.txt
:
1 Adore Varian avarian0@newyorker.com Female 192.57.150.231 2 Nancee Merrell nmerrell1@ted.com Female 22.198.121.181 3 Herta Friett hfriett2@dagondesign.com Female 33.167.32.89 4 Torie Venmore tvenmore3@gmpg.org Female 251.9.204.115 5 Deni Sealeaf dsealeaf4@nps.gov Female 210.53.81.212 6 Fidel Bezley fbezley5@lulu.com Male 72.173.218.75 7 Ulrikaumeko Standen ustanden6@geocities.jp Female 4.204.0.237 8 Odell Jursch ojursch7@utexas.edu 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 avarian0@newyorker.com Female Western New York $535,304.73 2 Merrell nmerrell1@ted.com Female Finger Lakes $309,033.10 3 Friett hfriett2@dagondesign.com Female Southern Tier $461,664.44 4 Venmore tvenmore3@gmpg.org Female Central New York $175,818.02 5 Sealeaf dsealeaf4@nps.gov Female North Country $126,690.15 6 Bezley fbezley5@lulu.com Male Mohawk Valley $366,733.78 7 Standen ustanden6@geocities.jp Female Capital District $674,634.93 8 Jursch ojursch7@utexas.edu 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 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 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 sensé est que join
s’attend à ce que les séparateurs de champ soient des espaces. Encore une fois, nous avons cela, 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
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 avarian0@newyorker.com Female 192.57.150.231 Varian avarian0@newyorker.com Female Western New York $535,304.73 2 Nancee Merrell nmerrell1@ted.com Female 22.198.121.181 Merrell nmerrell1@ted.com Female Finger Lakes $309,033.10 3 Herta Friett hfriett2@dagondesign.com Female 33.167.32.89 Friett hfriett2@dagondesign.com Female Southern Tier $461,664.44 4 Torie Venmore tvenmore3@gmpg.org Female 251.9.204.115 Venmore tvenmore3@gmpg.org Female Central New York $175,818.02 5 Deni Sealeaf dsealeaf4@nps.gov Female 210.53.81.212 Sealeaf dsealeaf4@nps.gov Female North Country $126,690.15 6 Fidel Bezley fbezley5@lulu.com Male 72.173.218.75 Bezley fbezley5@lulu.com Male Mohawk Valley $366,733.78 7 Ulrikaumeko Standen ustanden6@geocities.jp Female 4.204.0.237 Standen ustanden6@geocities.jp Female Capital District $674,634.93 8 Odell Jursch ojursch7@utexas.edu Male 1.138.85.117 Jursch ojursch7@utexas.edu 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 avarian0@newyorker.com Female Western New York $535,304.73 2 Merrell nmerrell1@ted.com Female Finger Lakes $309,033.10 3 Friett hfriett2@dagondesign.com Female Southern Tier $461,664.44 4 Venmore tvenmore3@gmpg.org Female Central New York $175,818.02 5 Sealeaf dsealeaf4@nps.gov Female North Country $126,690.15 8 Jursch ojursch7@utexas.edu Male Hudson Valley $663,821.09 6 Bezley fbezley5@lulu.com Male Mohawk Valley $366,733.78 7 Standen ustanden6@geocities.jp 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
join
rapporte que la septième ligne de file-3.txt
est en panne, donc il n’est 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 voyons donc la sortie pour elle.
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
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 avarian0@newyorker.com Female Western New York $535,304.73 2 Merrell nmerrell1@ted.com Female Finger Lakes $309,033.10 3 Friett hfriett2@dagondesign.com Female Southern Tier $461,664.44 4 Venmore tvenmore3@gmpg.org Female Central New York $175,818.02 5 Sealeaf dsealeaf4@nps.gov Female North Country $126,690.15 6 Bezley fbezley5@lulu.com Male Mohawk Valley $366,733.78 7 Standen ustanden6@geocities.jp 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 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.
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
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
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:
avarian0@newyorker.com Female 192.57.150.231 dsealeaf4@nps.gov Female 210.53.81.212 fbezley5@lulu.com Male 72.173.218.75 hfriett2@dagondesign.com Female 33.167.32.89 nmerrell1@ted.com Female 22.198.121.181 ojursch7@utexas.edu Male 1.138.85.117 tvenmore3@gmpg.org Female 251.9.204.115 ustanden6@geocities.jp Female 4.204.0.237
Et ce qui suit est le contenu du fichier-8.txt:
Female avarian0@newyorker.com Western New York $535,304.73 Female dsealeaf4@nps.gov North Country $126,690.15 Male fbezley5@lulu.com Mohawk Valley $366,733.78 Female hfriett2@dagondesign.com Southern Tier $461,664.44 Female nmerrell1@ted.com Finger Lakes $309,033.10 Male ojursch7@utexas.edu Hudson Valley $663,821.09 Female tvenmore3@gmpg.org Central New York $175,818.02 Female ustanden6@geocities.jp 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
Les fichiers sont joints sur l’adresse e-mail, qui est affichée 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
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
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 avarian0@newyorker.com Western New York $535,304.73 Female dsealeaf4@nps.gov North Country $126,690.15 Male Fbezley5@lulu.com Mohawk Valley $366,733.78 Female hfriett2@dagondesign.com Southern Tier $461,664.44 Female nmerrell1@ted.com Finger Lakes $309,033.10 Male Ojursch7@utexas.edu Hudson Valley $663,821.09 Female tvenmore3@gmpg.org Central New York $175,818.02 Female ustanden6@geocities.jp 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
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 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
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 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 d’avoir join
dans ton coin!