Combiner et transformer des fichiers texte

LinuxBeginner
Pratiquer maintenant

Introduction

Les fichiers texte peuvent être liés de différentes façons. Il faut parfois normaliser des caractères, parfois associer deux fichiers selon la position de leurs lignes, et parfois relier des enregistrements qui partagent une clé. Choisir le bon outil est plus important que mémoriser ses options.

Dans ce laboratoire, vous découvrirez trois outils ciblés : tr transforme un flux de caractères, paste combine des lignes selon leur position et join combine des enregistrements triés à partir d’un champ commun. Vous observerez chaque entrée et vérifierez le fichier obtenu avant de construire un petit rapport.

Traduire et nettoyer un flux de caractères

Dans cette étape, vous allez utiliser tr pour traduire des caractères, regrouper les séparateurs répétés et supprimer les caractères indésirables.

Créez une ligne volontairement incohérente. La commande cat -A rend ensuite visibles les détails habituellement invisibles : les espaces restent visibles sous forme d’intervalles et $ indique la fin de la ligne. Vous verrez ainsi précisément ce qui doit être nettoyé :

cd /home/labex/project/text-combine-lab
printf '  API,,,Worker,,WEB  \n' > raw-services.txt
cat -A raw-services.txt

tr SET1 SET2 remplace les caractères du premier ensemble par les caractères correspondants du second. Les classes portables [:upper:] et [:lower:] représentent respectivement les lettres majuscules et minuscules :

tr '[:upper:]' '[:lower:]' < raw-services.txt

Reliez maintenant trois étapes avec un pipeline. La première traduit la casse des lettres ; tr -s ',' regroupe chaque suite de virgules répétées en une seule virgule ; tr -d ' ' supprime les espaces ; et tee affiche et enregistre le flux final :

tr '[:upper:]' '[:lower:]' < raw-services.txt | tr -s ',' | tr -d ' ' | tee clean-services.txt

Le résultat doit être api,worker,web. tr lit un flux ; il ne modifie pas le fichier d’entrée directement.

Fusionner des lignes correspondantes avec Paste

Dans cette étape, vous allez combiner des fichiers dont les premières lignes correspondent, puis les deuxièmes lignes, et ainsi de suite.

Créez une colonne contenant les noms des services et une autre contenant les propriétaires :

cd /home/labex/project/text-combine-lab
printf '%s\n' api worker web > services.txt
printf '%s\n' team-blue team-green team-blue > owners.txt

paste place les lignes correspondantes côte à côte, en utilisant une tabulation par défaut :

paste services.txt owners.txt

Choisissez la virgule comme séparateur avec -d,, puis utilisez tee pour afficher et enregistrer un fichier de type CSV :

paste -d, services.txt owners.txt | tee service-owners.csv

paste ne compare pas les clés. Si un fichier contient des lignes manquantes ou réordonnées, les associations changent.

Joindre des enregistrements par une clé commune

Dans cette étape, vous allez combiner des enregistrements en fonction d’un premier champ correspondant, et non de la position des lignes.

Créez deux tables délimitées par des espaces, dans des ordres différents :

cd /home/labex/project/text-combine-lab
printf '%s\n' 'web 8080' 'api 9000' 'worker 9100' > ports-unsorted.txt
printf '%s\n' 'worker active' 'web active' 'api maintenance' > states-unsorted.txt

join exige que les deux entrées soient triées selon le champ de jointure. Préparez des copies triées. Dans sort -k1,1, -k sélectionne une clé et 1,1 signifie « commencer et terminer par le champ 1 » ; seul le nom du service détermine donc l’ordre :

sort -k1,1 ports-unsorted.txt > ports.txt
sort -k1,1 states-unsorted.txt > states.txt

Affichez leur contenu, puis joignez les valeurs correspondantes du champ 1 :

cat ports.txt
cat states.txt
join ports.txt states.txt | tee service-details.txt

Chaque résultat contient une seule fois la clé commune du service, suivie du port et de l’état.

Construire un rapport de services lisible

Dans cette étape, vous allez restructurer les enregistrements joints sans modifier les tables sources.

Remplacez les espaces par des virgules pour produire un rapport simple :

cd /home/labex/project/text-combine-lab
tr ' ' ',' < service-details.txt | tee service-report.csv

Ajoutez un en-tête en regroupant deux commandes. Les accolades envoient la sortie des deux commandes vers une seule redirection :

{ echo 'service,port,state'; cat service-report.csv; } > service-report-with-header.csv
cat service-report-with-header.csv

Comptez les enregistrements de données sans compter l’en-tête :

tail -n +2 service-report-with-header.csv | wc -l | tr -d ' ' > service-count.txt
cat service-count.txt

Ce flux de travail conserve des étapes courtes et faciles à inspecter : données normalisées, données jointes, données mises en forme, puis rapport final.

Résumé

Vous avez utilisé tr pour normaliser les caractères, paste pour créer des colonnes selon leur position et join pour relier des données triées par clé. Vous avez ensuite combiné ces petites étapes pour produire un rapport CSV lisible, tout en conservant les entrées d’origine intactes.