Commande Linux join : Fusion de fichiers

LinuxBeginner
Pratiquer maintenant

Introduction

Dans cet atelier, vous allez apprendre à utiliser la commande join sous Linux pour fusionner des données provenant de plusieurs fichiers. Nous allons simuler un scénario dans lequel vous travaillez au département des ressources humaines d'une entreprise et devez combiner les informations sur les employés issues de différentes bases de données. Cet exercice pratique démontrera la puissance et la flexibilité de la commande join pour les tâches de traitement de données.

Comprendre les fichiers de données

Commençons par examiner le contenu de nos fichiers de données sur les employés. Nous disposons de deux fichiers : employees.txt et salaries.txt.

Tout d'abord, placez-vous dans le répertoire du projet :

cd /home/labex/project

Cette commande modifie votre répertoire de travail actuel pour /home/labex/project. Toutes les opérations suivantes seront effectuées dans ce répertoire.

Maintenant, visualisons le contenu de employees.txt :

cat employees.txt

La commande cat affiche le contenu du fichier. Vous devriez voir un résultat similaire à celui-ci :

1001 John Engineering
1002 Sarah Marketing
1003 Mike Sales
1004 Emily HR
1005 David Finance

Chaque ligne représente un employé avec son identifiant (ID), son nom et son département.

Ensuite, regardons le fichier salaries.txt :

cat salaries.txt

Le résultat devrait ressembler à ceci :

1001 75000
1002 65000
1003 70000
1004 60000
1005 80000

Ce fichier contient les identifiants des employés et leurs salaires correspondants.

Ces fichiers représentent des bases de données distinctes que nous allons fusionner à l'aide de la commande join.

Opération de fusion de base

Maintenant que nous comprenons nos données, utilisons la commande join pour fusionner les informations des deux fichiers en se basant sur l'ID de l'employé.

Exécutez la commande suivante :

join employees.txt salaries.txt

Vous devriez obtenir ce résultat :

1001 John Engineering 75000
1002 Sarah Marketing 65000
1003 Mike Sales 70000
1004 Emily HR 60000
1005 David Finance 80000

Analysons ce qui s'est passé :

  1. La commande join a examiné le premier champ (l'ID de l'employé) dans les deux fichiers.
  2. Lorsqu'elle a trouvé des ID correspondants, elle a combiné les lignes des deux fichiers.
  3. Le résultat affiche l'ID de l'employé, suivi de tous les champs de employees.txt, puis de tous les champs de salaries.txt (à l'exception de l'ID, qui serait redondant).

Cela nous donne une vue complète des informations de chaque employé sur une seule ligne. La commande join est particulièrement utile lorsque vos données sont réparties sur plusieurs fichiers mais que vous souhaitez les visualiser ou les analyser ensemble.

Personnalisation de la sortie de fusion

Parfois, nous souhaitons modifier l'ordre des champs dans notre résultat ou n'inclure que des champs spécifiques. Nous pouvons le faire en spécifiant les numéros de champs après la commande de fusion.

Essayez cette commande :

join -o 1.2,1.3,2.2,1.1 employees.txt salaries.txt

Vous devriez voir :

John Engineering 75000 1001
Sarah Marketing 65000 1002
Mike Sales 70000 1003
Emily HR 60000 1004
David Finance 80000 1005

Décortiquons l'option -o :

  • -o signifie "format de sortie" (output format).
  • 1.2 désigne le deuxième champ du premier fichier (le nom).
  • 1.3 désigne le troisième champ du premier fichier (le département).
  • 2.2 désigne le deuxième champ du second fichier (le salaire).
  • 1.1 désigne le premier champ du premier fichier (l'ID de l'employé).

Cela nous permet de personnaliser l'ordre des informations en sortie. C'est particulièrement utile lorsque vous devez réorganiser des données pour un format de rapport spécifique ou lorsque vous n'avez besoin que de certains champs de chaque fichier.

Gestion des enregistrements sans correspondance

Dans des scénarios réels, il arrive que certains enregistrements d'un fichier n'aient pas de correspondance dans l'autre. Simulons cela en ajoutant un nouvel employé qui n'a pas encore de salaire attribué.

Ajoutez cet employé à employees.txt :

echo "1006 Alex IT" >> employees.txt

L'opérateur >> ajoute la nouvelle ligne à la fin du fichier sans écraser le contenu existant.

Maintenant, si nous exécutons notre commande de fusion de base :

join employees.txt salaries.txt

Vous remarquerez qu'Alex n'apparaît pas dans le résultat car il n'y a pas d'enregistrement correspondant dans salaries.txt.

Pour inclure les enregistrements sans correspondance, nous pouvons utiliser l'option -a :

join -a 1 employees.txt salaries.txt

Désormais, vous devriez voir Alex dans la sortie :

1001 John Engineering 75000
1002 Sarah Marketing 65000
1003 Mike Sales 70000
1004 Emily HR 60000
1005 David Finance 80000
1006 Alex IT

L'option -a 1 indique à join d'inclure les lignes du premier fichier (employees.txt) qui ne peuvent pas être appariées. C'est utile lorsque vous voulez voir tous les enregistrements d'un fichier, même s'ils n'ont pas de correspondance dans l'autre.

Fusionner sur un champ différent

Jusqu'à présent, nous avons fusionné nos fichiers sur la base du premier champ (l'ID de l'employé). Mais que faire si nous voulons fusionner sur un champ différent ? Cela peut être utile lorsque vos fichiers sont organisés différemment ou lorsque vous devez fusionner des données basées sur un attribut commun autre qu'un identifiant.

Créons un nouveau fichier nommé departments.txt contenant des codes de département :

cat << EOF > departments.txt
Engineering ENG
Marketing MKT
Sales SLS
HR HRS
Finance FIN
IT ITS
EOF

Cette commande crée un nouveau fichier departments.txt avec les noms des départements et leurs codes correspondants.

Maintenant, fusionnons ce fichier avec notre fichier employees.txt en nous basant sur le nom du département :

join -1 3 -2 1 employees.txt departments.txt

Vous devriez voir :

Engineering 1001 John ENG
Marketing 1002 Sarah MKT
Sales 1003 Mike SLS
HR 1004 Emily HRS
Finance 1005 David FIN
IT 1006 Alex ITS

Analysons la commande :

  • -1 3 indique à join d'utiliser le troisième champ du premier fichier (employees.txt) comme champ de fusion.
  • -2 1 lui indique d'utiliser le premier champ du second fichier (departments.txt) comme champ de fusion.

Cela nous permet de fusionner des fichiers sur n'importe quel champ commun, et pas seulement sur le premier. C'est particulièrement pratique lorsque vos fichiers ont des structures différentes mais partagent des informations communes.

Résumé

Dans cet atelier, vous avez appris à utiliser la commande join sous Linux pour fusionner des données provenant de plusieurs fichiers. Nous avons exploré plusieurs fonctionnalités clés de join :

  • Fusion de base de deux fichiers à partir d'un champ commun.
  • Personnalisation de l'ordre de sortie à l'aide de l'option -o.
  • Inclusion des enregistrements sans correspondance avec l'option -a.
  • Fusion sur des champs autres que la première colonne en utilisant les options -1 et -2.

D'autres options de join non abordées dans cet atelier incluent :

  • -t CHAR : Utilise CHAR comme séparateur de champ en entrée et en sortie.
  • -i : Ignore les différences de casse lors de la comparaison des champs.
  • -e STRING : Remplace les champs d'entrée manquants par STRING.
  • -j FIELD : Équivalent à '-1 FIELD -2 FIELD'.
  • -v FILE_NUMBER : Similaire à -a FILE_NUMBER, mais supprime les lignes de sortie fusionnées (n'affiche que les lignes sans correspondance).

La commande join est un outil puissant pour le traitement de données sous Linux, vous permettant de combiner efficacement des informations provenant de sources multiples. Au fur et à mesure que vous continuerez à manipuler des données dans votre environnement Linux, gardez à l'esprit que join peut être un atout précieux pour fusionner et analyser des informations issues de différents fichiers.