Einführung
Textdateien können auf unterschiedliche Weise zusammengehören. Manchmal müssen Zeichen vereinheitlicht werden. Manchmal entsprechen sich zwei Dateien anhand ihrer Zeilenposition. In anderen Fällen haben Datensätze einen gemeinsamen Schlüssel. Das passende Werkzeug auszuwählen ist wichtiger, als sich alle Optionen zu merken.
In diesem Lab lernen Sie drei spezialisierte Werkzeuge kennen: tr wandelt einen Zeichenstrom um, paste kombiniert Zeilen anhand ihrer Position, und join verbindet sortierte Datensätze über ein gemeinsames Feld. Sie betrachten zunächst jede Eingabe und überprüfen die resultierende Datei, bevor Sie einen kleinen Bericht erstellen.
Einen Zeichenstrom umwandeln und bereinigen
In diesem Schritt verwenden Sie tr, um Zeichen umzuwandeln, wiederholte Trennzeichen zusammenzufassen und unerwünschte Zeichen zu löschen.
Erstellen Sie zunächst absichtlich eine uneinheitliche Zeile. Mit cat -A machen Sie normalerweise unsichtbare Details sichtbar: Leerzeichen bleiben als Abstände erkennbar, und $ markiert das Zeilenende. So sehen Sie genau, was bereinigt werden muss:
cd /home/labex/project/text-combine-lab
printf ' API,,,Worker,,WEB \n' > raw-services.txt
cat -A raw-services.txt
tr SET1 SET2 ersetzt Zeichen aus der ersten Menge durch die entsprechenden Zeichen aus der zweiten Menge. Die portablen Klassen [:upper:] und [:lower:] stehen für Groß- beziehungsweise Kleinbuchstaben:
tr '[:upper:]' '[:lower:]' < raw-services.txt
Verknüpfen Sie nun drei Verarbeitungsschritte. Der erste wandelt die Groß- und Kleinschreibung um. tr -s ',' fasst jede Folge wiederholter Kommas zu einem einzigen Komma zusammen. tr -d ' ' löscht Leerzeichen. tee zeigt den abschließenden Datenstrom an und speichert ihn gleichzeitig:
tr '[:upper:]' '[:lower:]' < raw-services.txt | tr -s ',' | tr -d ' ' | tee clean-services.txt
Das Ergebnis sollte api,worker,web lauten. tr liest einen Datenstrom; die Eingabedatei wird nicht direkt bearbeitet.
Entsprechende Zeilen mit Paste zusammenführen
In diesem Schritt kombinieren Sie Dateien, deren erste Zeilen einander entsprechen, deren zweite Zeilen einander entsprechen und so weiter.
Erstellen Sie eine Spalte mit Servicenamen und eine Spalte mit den zugehörigen Teams:
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 stellt entsprechende Zeilen nebeneinander. Standardmäßig verwendet der Befehl einen Tabulator als Trennzeichen:
paste services.txt owners.txt
Verwenden Sie mit -d, ein Komma als Trennzeichen. Mit tee zeigen Sie die Ausgabe an und speichern sie als CSV-ähnliche Datei:
paste -d, services.txt owners.txt | tee service-owners.csv
paste vergleicht keine Schlüssel. Wenn eine Datei fehlende oder anders angeordnete Zeilen enthält, ändert sich die Zuordnung der Zeilen.
Datensätze über einen gemeinsamen Schlüssel verknüpfen
In diesem Schritt kombinieren Sie Datensätze anhand eines übereinstimmenden ersten Feldes und nicht anhand ihrer Zeilenposition.
Erstellen Sie zwei durch Leerzeichen getrennte Tabellen in unterschiedlicher Reihenfolge:
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 erwartet, dass beide Eingaben nach dem Verknüpfungsfeld sortiert sind. Erstellen Sie sortierte Kopien. In sort -k1,1 wählt -k einen Schlüssel aus. 1,1 bedeutet „mit Feld 1 beginnen und mit Feld 1 enden“, sodass nur der Servicename die Reihenfolge bestimmt:
sort -k1,1 ports-unsorted.txt > ports.txt
sort -k1,1 states-unsorted.txt > states.txt
Sehen Sie sich die Dateien an und verknüpfen Sie anschließend die übereinstimmenden Werte in Feld 1:
cat ports.txt
cat states.txt
join ports.txt states.txt | tee service-details.txt
Jedes Ergebnis enthält den gemeinsamen Serviceschlüssel einmal, gefolgt von Port und Status.
Einen übersichtlichen Servicebericht erstellen
In diesem Schritt strukturieren Sie die verknüpften Datensätze neu, ohne die Quelltabellen zu verändern.
Wandeln Sie Leerzeichen in Kommas um, um einen einfachen Bericht zu erstellen:
cd /home/labex/project/text-combine-lab
tr ' ' ',' < service-details.txt | tee service-report.csv
Fügen Sie eine Kopfzeile hinzu, indem Sie zwei Befehle gruppieren. Die geschweiften Klammern leiten die Ausgabe beider Befehle gemeinsam um:
{ echo 'service,port,state'; cat service-report.csv; } > service-report-with-header.csv
cat service-report-with-header.csv
Zählen Sie die Datensätze, ohne die Kopfzeile mitzuzählen:
tail -n +2 service-report-with-header.csv | wc -l | tr -d ' ' > service-count.txt
cat service-count.txt
Dieser Ablauf bewahrt kleine, leicht überprüfbare Verarbeitungsschritte: normalisierte Daten, verknüpfte Daten, formatierte Daten und schließlich den fertigen Bericht.
Zusammenfassung
Sie haben tr zur zeichenweisen Normalisierung, paste für positionsbasierte Spalten und join für sortierte Beziehungen über gemeinsame Schlüssel verwendet. Anschließend haben Sie die einzelnen Schritte zu einem übersichtlichen CSV-Bericht kombiniert, während die ursprünglichen Eingabedateien unverändert blieben.



