Si vous souhaitez fusionner les données de deux fichiers texte en faisant correspondre un champ commun, tu peux utiliser linux join
commander. Ajoutez une touche de piquant à vos fichiers de données statiques. Nous allons vous montrer comment l'utiliser.
Faire correspondre les données entre les fichiers
Les données sont reines. Sociétés, les entreprises et les ménages le gèrent. Mais les données stockées dans différents fichiers et collectées par différentes personnes sont un problème. En même temps savoir quels fichiers ouvrir pour trouver les informations que vous voulez, la mise en page et le format des fichiers sont susceptibles d'être différents.
De plus, vous devez faire face au casse-tête administratif dont les fichiers doivent être mis à jour, lesquels doivent être soutenus, lesquels sont hérités et lesquels peuvent être archivés.
En même temps, si vous avez besoin de consolider vos données ou d'effectuer des analyses sur un ensemble de données complet, a un obstacle supplémentaire. Comment rationalisez-vous les données dans les différents fichiers avant de pouvoir faire ce que vous devez faire avec eux? Comment abordez-vous l'étape de préparation des données?
La bonne nouvelle est que si les fichiers partagent au moins un élément de données commun, Linux join
La commande peut vous sortir de la boue.
Fichiers de données
Toutes les données que nous utiliserons pour démontrer l'utilisation du join
La commande est fictive, en commençant par les deux fichiers suivants:
fichier chat-1.txt
fichier de chat-2.txt
Voici le contenu de file-1.txt
:
1 Adore Varian [email protected] Femme 192.57.150.231 2 Nancee Merrell [email protected] Femme 22.198.121.181 3 Herta Friett [email protected] Femme 33.167.32.89 4 Torie Venmore [email protected] Femme 251.9.204.115 5 Deni Sealeaf [email protected] Femme 210.53.81.212 6 Fidel Bezley [email protected] Homme 72.173.218.75 7 Ulrikaumeko Standen [email protected] Femme 4.204.0.237 8 Odell Jursch [email protected] Homme 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 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] Femme Ouest de l'État de New York $535,304.73 2 Merrell [email protected] Lacs des doigts féminins $309,033.10 3 Friett [email protected] Femme Tier Sud $461,664.44 4 Venmore [email protected] Femme Centre de New York $175,818.02 5 Sealeaf [email protected] Femme Nord Pays $126,690.15 6 Bezley [email protected] Mâle Vallée Mohawk $366,733.78 7 Standen [email protected] District de la capitale féminine $674,634.93 8 Jursch [email protected] Homme Vallée de l'Hudson $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 en dollars
Les join
La commande fonctionne avec “des champs”, Quoi, dans ce contexte, désigne une section de texte entourée d'espaces vides, 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.
Pour cela, 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 fichier, donc c'est pas bon. Le prénom n'apparaît que dans un seul fichier, donc on ne peut 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 à des entrées masculines et féminines, car ils sont trop vagues. Les régions de New York et les valeurs en dollars n'apparaissent que dans un seul fichier plus.
Malgré cela, 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 aux fichiers confirme également que les lignes de chacun correspondent à la même personne., afin que nous puissions 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 juste, nous pouvons dire join
quel champ utiliser dans chaque fichier.
Malgré cela, soyez prudent avec des champs comme les régions de New York; dans un fichier séparé par des espaces, chaque mot dans un nom de région ressemble à un champ. Parce que certaines régions ont des noms de deux ou trois mots, a en fait un nombre différent de champs dans le même fichier. C'est bien, tant que les champs qui apparaissent sur la ligne avant les régions de New York correspondent.
La commande de jointure
Premier, le champ à apparier doit être trié. Nous avons des nombres croissants dans les deux fichiers, donc nous remplissons ce critère. Par défaut, join
utilise le premier champ d'un fichier, Que voulons-nous. Un autre défaut sensé est que join
attendez-vous à ce que les séparateurs de champs soient des blancs. De nouveau, nous avons ça, afin que nous puissions aller de l'avant et enflammer join
.
Comment nous utilisons toutes les valeurs par défaut, notre commande est simple:
joindre fichier-1.txt fichier-2.txt
join
considérer les fichiers comme “déposer un” et “fichier deux” selon l'ordre dans lequel ils apparaissent sur la ligne de commande.
Le résultat est le suivant:
1 Adore Varian [email protected] Femme 192.57.150.231 Varian [email protected] Femme Ouest de l'État de New York $535,304.73 2 Nancee Merrell [email protected] Femme 22.198.121.181 Merrell [email protected] Lacs des doigts féminins $309,033.10 3 Herta Friett [email protected] Femme 33.167.32.89 Friett [email protected] Femme Tier Sud $461,664.44 4 Torie Venmore [email protected] Femme 251.9.204.115 Venmore [email protected] Femme Centre de New York $175,818.02 5 Deni Sealeaf [email protected] Femme 210.53.81.212 Sealeaf [email protected] Femme Nord Pays $126,690.15 6 Fidel Bezley [email protected] Homme 72.173.218.75 Bezley [email protected] Mâle Vallée Mohawk $366,733.78 7 Ulrikaumeko Standen [email protected] Femme 4.204.0.237 Standen [email protected] District de la capitale féminine $674,634.93 8 Odell Jursch [email protected] Homme 1.138.85.117 Jursch [email protected] Homme Vallée de l'Hudson $663,821.09
La sortie est formatée comme suit: Le champ dans lequel les lignes ont été appariées est imprimé en premier, suivi des autres champs du fichier un, puis les champs du fichier deux sans le champ de correspondance.
Champs non classés
Essayons quelque chose dont nous savons qu'il ne fonctionnera pas. Nous allons mettre les lignes dans un fichier dans le désordre pour 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] Femme Ouest de l'État de New York $535,304.73 2 Merrell [email protected] Lacs des doigts féminins $309,033.10 3 Friett [email protected] Femme Tier Sud $461,664.44 4 Venmore [email protected] Femme Centre de New York $175,818.02 5 Sealeaf [email protected] Femme Nord Pays $126,690.15 8 Jursch [email protected] Homme Vallée de l'Hudson $663,821.09 6 Bezley [email protected] Mâle Vallée Mohawk $366,733.78 7 Standen [email protected] District de la capitale féminine $674,634.93
Nous écrivons la commande suivante pour essayer de rejoindre file-3.txt
pour file-1.txt
:
joindre fichier-1.txt fichier-3.txt
join
rapporte que la septième ligne de file-3.txt
il est hors service, il n'est donc pas traité. La ligne sept est celle qui commence par le chiffre six, qui doit venir avant huit heures dans une liste correctement ordonnée. La sixième ligne du fichier (commençant par "8 Odell") c'était le dernier traité, donc on voit le résultat.
Vous pouvez utiliser le --check-order
option si vous prétendez voir si join
vous êtes satisfait de l'ordre de tri des fichiers; aucune tentative ne sera faite pour les combiner.
Pour le faire, nous écrivons ce qui suit:
join --check-order file-1.txt file-3.txt
join
vous dit à l'avance qu'il y aura un hic avec la ligne sept du fichier file-3.txt
.
Fichiers avec des lignes manquantes
Au file-4.txt
, la dernière ligne a été supprimée, donc il n'y a pas de ligne huit. Le contenu est le suivant:
1 Varian [email protected] Femme Ouest de l'État de New York $535,304.73 2 Merrell [email protected] Lacs des doigts féminins $309,033.10 3 Friett [email protected] Femme Tier Sud $461,664.44 4 Venmore [email protected] Femme Centre de New York $175,818.02 5 Sealeaf [email protected] Femme Nord Pays $126,690.15 6 Bezley [email protected] Mâle Vallée Mohawk $366,733.78 7 Standen [email protected] District de la capitale féminine $674,634.93
Nous écrivons ce qui suit et, étonnamment, join
ne se plaint pas et traite toutes les lignes qu'il peut:
joindre fichier-1.txt fichier-4.txt
La sortie répertorie sept lignes fusionnées.
Les -a
L'option (l'impression ne peut pas être couplée) indique join
pour imprimer également les lignes qui ne pouvaient pas correspondre.
Ici, nous écrivons la commande suivante pour lui dire join
pour imprimer les lignes du fichier un qui ne peuvent pas correspondre aux lignes du fichier deux:
rejoindre -a 1 fichier-1.txt fichier-4.txt
Sept lignes correspondent et la ligne huit du fichier un s'imprime, pas de hasard. Il n'y a pas d'informations combinées car file-4.txt
ne contenait pas de ligne huit qui pourrait correspondre. Malgré cela, au moins, il apparaît toujours dans la sortie afin que vous sachiez que vous n'avez pas de correspondance dans file-4.txt
.
Nous écrivons ce qui suit -v
(supprimer les lignes jointes) pour révéler les lignes dépareillées:
join -v fichier-1.txt fichier-4.txt
Nous voyons que la ligne huit est la seule qui n'a pas de correspondance dans le fichier deux.
Faire correspondre d'autres champs
Faisons correspondre deux nouveaux fichiers dans un champ autre que celui par défaut (champ un). Ce qui suit est le contenu du fichier-7.txt:
[email protected] Femme 192.57.150.231 [email protected] Femme 210.53.81.212 [email protected] Homme 72.173.218.75 [email protected] Femme 33.167.32.89 [email protected] Femme 22.198.121.181 [email protected] Homme 1.138.85.117 [email protected] Femme 251.9.204.115 [email protected] Femme 4.204.0.237
Et ce qui suit est le contenu du fichier-8.txt:
Femme [email protected] Ouest de l'État de New York $535,304.73 Femme [email protected] Pays du Nord $126,690.15 Homme [email protected] Vallée de la Mohawk $366,733.78 Femme [email protected] Niveau Sud $461,664.44 Femme [email protected] Finger Lakes $309,033.10 Homme [email protected] Vallée de l'Hudson $663,821.09 Femme [email protected] Centre de New York $175,818.02 Femme [email protected] District de la capitale $674,634.93
Le seul champ sensible qui peut être utilisé 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 le -1
(archiver un champ) et -2
(fichier à deux champs) options. Nous les suivrons d'un numéro indiquant quel champ de chaque fichier doit être utilisé pour joindre.
Nous écrivons ce qui suit pour compter join
d'utiliser le premier champ dans le fichier un et le second dans le fichier deux:
rejoindre -1 1 -2 2 fichier-7.txt fichier-8.txt
Les fichiers se joignent à l'adresse e-mail, affiché comme premier champ de chaque ligne dans la sortie.
Utilisation de différents diviseurs 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 délimités par des virgules; le seul espace blanc est entre les noms de lieux à plusieurs mots:
fichier chat-5.txt
fichier chat-6.txt
Nous pouvons utiliser le -t
(caractère de séparation) pour compter join
quel caractère utiliser comme séparateur de champ. Dans cette circonstance, est la virgule, donc on écrit la commande suivante:
découper, fichier-5.txt fichier-6.txt
Toutes les lignes correspondent et les espaces sont conservés dans les noms de lieux.
Ignorer les majuscules et minuscules
Autre fichier, file-9.txt
, est presque identique à file-8.txt
. La seule différence est que certaines adresses e-mail ont une majuscule, comme il est montré dans ce qui suit:
Femme [email protected] Ouest de l'État de New York $535,304.73 Femme [email protected] Pays du Nord $126,690.15 Homme [email protected] Vallée de la Mohawk $366,733.78 Femme [email protected] Niveau Sud $461,664.44 Femme [email protected] Finger Lakes $309,033.10 Homme [email protected] Vallée de l'Hudson $663,821.09 Femme [email protected] Centre de New York $175,818.02 Femme [email protected] District de la capitale $674,634.93
Quand nous nous réunissons file-7.txt
et file-8.txt
, ça a très bien marché. Voyons ce qui se passe avec file-7.txt
et file-9.txt
.
On écrit la commande suivante:
rejoindre -1 1 -2 2 fichier-7.txt fichier-9.txt
Nous ne faisons correspondre que six lignes. Les différences entre les lettres majuscules et minuscules ont empêché les deux autres adresses e-mail de se joindre.
Malgré cela, nous pouvons utiliser le -i
(ignorer les majuscules et les minuscules) possibilité de forcer join
pour ignorer ces différences et faire correspondre les champs qui contiennent le même texte, quel que soit le cas.
On écrit la commande suivante:
rejoindre -1 1 -2 2 -je fichier-7.txt fichier-9.txt
Les huit lignes sont correctement combinées et jointes.
Mélanger et assortir
Au join
, vous avez un allié puissant lorsque vous avez du mal à préparer vos données. Peut-être que vous avez besoin d'analyser les données, ou peut-être essayez-vous de les formater pour les importer dans un autre système.
Peu importe la situation, vous serez heureux d'avoir join
dans ton coin!