VMware ESXi and vSphere Cluster Management

Linux paste-Befehl: Dateien zeilenweise zusammenführen

Lerne den Linux-Befehl paste kennen: Dateien zeilenweise verbinden, Trennzeichen mit -d ändern, den seriellen Modus -s nutzen und Ausgaben weiterverarbeiten.

Der Linux-Befehl paste führt Zeilen aus einer oder mehreren Textdateien zusammen. Im Standardmodus stellt er gleich nummerierte Zeilen nebeneinander. So lassen sich einfache Listen oder tabellarische Daten schnell kombinieren.

Wichtig: paste verknüpft Inhalte ausschließlich nach ihrer Position beziehungsweise Zeilennummer. Der Befehl sucht nicht nach gleichen Namen, IDs oder anderen Schlüsselwerten.

Zweck und Grundprinzip

Im normalen, auch parallelen genannten Modus liest paste die erste Zeile jeder Eingabedatei und gibt sie gemeinsam aus. Danach folgen die zweiten Zeilen aller Dateien, dann die dritten und so weiter.

Jede Eingabedatei liefert dabei ein logisches Feld beziehungsweise eine Spalte. Zwischen diesen Feldern steht standardmäßig ein Tabulator. Ein Tabulator ist ein Steuerzeichen zur Feldtrennung und wird häufig als \t geschrieben.

Die sichtbare Ausrichtung im Terminal ist nicht dasselbe wie die Datenstruktur: Ein Tabulator springt zum nächsten Tabstopp. Inhalte mit unterschiedlicher Länge können deshalb optisch ungleichmäßig wirken, obwohl die Felder korrekt durch Tabulatoren getrennt sind.

Grundsyntax

paste [OPTIONEN] DATEI1 [DATEI2 ...]

Ohne Optionen schreibt paste die zusammengeführte Ausgabe auf die Standardausgabe, normalerweise auf das Terminal. Mit einer Shell-Umleitung speicherst du sie in einer Datei:

paste personen.txt orte.txt > personen_orte.tsv

Die Reihenfolge der Dateinamen bestimmt die Reihenfolge der erzeugten Felder. Im folgenden Beispiel steht der Inhalt von personen.txt links und der Inhalt von orte.txt rechts:

paste personen.txt orte.txt

Ein einzelner Bindestrich - steht für die Standardeingabe. Dadurch kann eine Pipeline-Daten liefern, während eine andere Datei direkt als Argument angegeben wird:

printf '%s\n' Nord Süd West | paste - regionen.txt

Option | Langform | Wirkung | Beispielanwendung

-d DELIMITERS | --delimiters=DELIMITERS | Ersetzt den standardmäßigen Tabulator durch angegebene Trennzeichen. | paste -d ',' a.txt b.txt

-s | --serial | Führt die Zeilen jeder Datei seriell zu einer Ausgabezeile zusammen. | paste -s -d ';' werte.txt

- | keine Langform | Liest an dieser Position aus der Standardeingabe. | ... | paste - datei.txt

Weitere Langoptionen sind je nach Installation, insbesondere bei GNU-Versionen, distributionsabhängig.

Zeilenweise Zusammenführung im Standardmodus

Zwei gleich lange Listen verbinden

Angenommen, die Dateien enthalten folgende Werte:

# personen.txt
Ada
Ben
Cem
# orte.txt
Berlin
Bonn
Kiel

Der Befehl lautet:

paste personen.txt orte.txt

Die Ausgabe besteht aus drei Zeilen. Zwischen Name und Ort befindet sich jeweils ein Tabulator:

Ada    Berlin
Ben Bonn
Cem Kiel

Die Abstände im Beispiel stellen den Tabulator nur sichtbar dar. Im tatsächlichen Ausgabestrom ist dort ein Tabulatorzeichen enthalten, kein festes Muster aus Leerzeichen.

Drei oder mehr Dateien kombinieren

Mehrere Dateien werden zu zusätzlichen Feldern jeder Ausgabezeile:

paste id.txt produkt.txt bestand.txt

Bei diesen Inhalten:

id.txt:       101       produkt.txt: Tastatur       bestand.txt: 7
102 Maus 14

entsteht sinngemäß:

101    Tastatur    7
102 Maus 14

Die erste Zeile jeder Datei bildet einen Datensatz, ebenso die zweite Zeile jeder Datei. Eine inhaltliche Prüfung, ob ID, Produkt und Bestand fachlich zusammengehören, führt paste nicht durch.

Unterschiedlich lange Eingabedateien

Endet eine Datei früher, entfernt paste die übrigen Zeilen der längeren Datei nicht. Für die fehlenden Werte entstehen leere Felder. Die Ausgabe läuft weiter, bis alle Eingabedateien verarbeitet sind.

paste links.txt rechts.txt

Mit:

links.txt:  A    B    C
rechts.txt: 1

ergibt sich sinngemäß:

A    1
B
C

Zeilennummer | Wert aus Datei A | Wert aus Datei B | Resultierendes Feldmuster

Zeilen mit Werten in beiden Dateien | vorhanden | vorhanden | zwei gefüllte Felder, getrennt durch den Delimiter

Zeilen nach dem Ende einer kürzeren Datei | vorhanden | nicht vorhanden | gefülltes Feld plus leeres Feld

Leere Felder sind Daten, keine automatische Ausrichtungshilfe. paste richtet Inhalte außerdem nicht anhand ihrer sichtbaren Zeichenbreite aus und entfernt keine Zeilen.

Mit wc -l kannst du die Zeilenzahlen vergleichen:

wc -l links.txt rechts.txt

Trennzeichen mit -d ändern

Die Option -d beziehungsweise --delimiters legt fest, welche Zeichen zwischen den zusammengeführten Feldern stehen. Ohne diese Option verwendet paste Tabulatoren.

paste -d ',' personen.txt orte.txt

Beispielausgabe:

Ada,Berlin
Ben,Bonn
Cem,Kiel

Ebenso sind Semikolon, Doppelpunkt, Leerzeichen oder Schrägstrich möglich:

paste -d ';' a.txt b.txt
paste -d ':' a.txt b.txt
paste -d ' ' a.txt b.txt
paste -d '/' a.txt b.txt

Ein Leerzeichen als Trennzeichen kann die spätere Verarbeitung erschweren, weil nicht mehr klar zwischen einem Feldtrenner und Leerzeichen innerhalb eines Wertes unterschieden wird. Für strukturierte Textdaten sind Tabulatoren oder ein bewusst gewähltes Sonderzeichen oft eindeutiger.

Delimiter-Listen

Eine Delimiter-Liste enthält mehrere Trennzeichen. Sie werden bei mehreren Eingabefeldern nacheinander verwendet. Bei Bedarf wird die Liste wiederholt. Das genaue Verhalten bei Randfällen sollte auf dem Zielsystem geprüft werden.

paste -d ',;' a.txt b.txt c.txt

Hier wird zwischen dem ersten und zweiten Feld ein Komma und zwischen dem zweiten und dritten Feld ein Semikolon eingesetzt. Bei weiteren Feldern beginnt die Delimiter-Liste wieder von vorn.

Escape-Sequenzen

Je nach paste-Implementierung werden Escape-Sequenzen in der Delimiter-Angabe ausgewertet. Häufige Schreibweisen sind:

  • \t für einen Tabulator
  • \n für einen Zeilenumbruch
  • \\ für einen umgekehrten Schrägstrich
  • \0 für ein Nullzeichen beziehungsweise eine spezielle Null-Delimiter-Schreibweise, abhängig von der Implementierung
  • Oktale Schreibweisen für Zeichen, deren Form und Unterstützung systemabhängig sein können

Shell-Quoting und die Escape-Verarbeitung von paste wirken zusammen. Bei Sonderzeichen solltest du die lokale Dokumentation prüfen und das Ergebnis mit kleinen Testdateien kontrollieren.

Serielles Zusammenführen mit -s

Die Option -s beziehungsweise --serial aktiviert den seriellen Modus. Statt gleich nummerierte Zeilen verschiedener Dateien nebeneinanderzustellen, führt paste die Zeilen jeder einzelnen Datei in eine Ausgabezeile über.

paste -d ';' -s werte.txt

Enthält werte.txt:

rot
grün
blau

lautet die Ausgabe:

rot;grün;blau

Bei mehreren Dateien erzeugt paste -s pro Datei eine serielle Zeile. Die Reihenfolge entspricht der Reihenfolge der Argumente:

paste -s -d ',' erste.txt zweite.txt

Die erste Ausgabezeile enthält alle Zeilen aus erste.txt, die zweite alle Zeilen aus zweite.txt. Die Kombination von -s und -d ist praktisch, um eine einfache Werteliste in eine getrennte Zeile umzuwandeln.

Praktische Datenverarbeitung

Listen zu einfachen Datensätzen verbinden

Namen und Kennungen lassen sich positionsbezogen verbinden:

paste namen.txt kennungen.txt > personen.tsv

Die Datei personen.tsv enthält danach pro Zeile einen Namen und die zugehörige Kennung. Diese Zuordnung ist nur dann korrekt, wenn beide Listen in derselben Reihenfolge vorliegen.

Mit anderen Befehlen in einer Pipeline

paste kann mit klassischen Textwerkzeugen kombiniert werden:

paste personen.txt orte.txt | column -t -s $'\t'

column -t formatiert die bereits getrennten Felder für eine lesbare Terminalanzeige. Es verändert nicht die fachliche Zuordnung der Daten und ist keine zusätzliche Datenverknüpfung.

paste a.txt b.txt | cut -f 2
paste a.txt b.txt | awk -F '\t' '{ print $1, $2 }'
sort namen.txt | paste - kennungen.txt

cut extrahiert Felder, awk erlaubt regelbasierte Verarbeitung und sort kann Daten vorab sortieren. Sortieren ist aber nur dann sinnvoll, wenn die daraus entstehende Reihenfolge fachlich die gewünschte Zuordnung ergibt.

Einfache CSV-ähnliche Ausgabe

paste -d ',' personen.txt orte.txt > personen.csv

Das erzeugt eine kommaseparierte, einfache Textausgabe. Es ist jedoch keine vollständige CSV-Implementierung: paste maskiert keine eingebetteten Kommas, Anführungszeichen oder Zeilenumbrüche.

Abgrenzung zu ähnlichen Befehlen

Befehl | Arbeitsweise | Geeigneter Einsatzfall | Wichtige Abgrenzung

paste | Verbindet gleich nummerierte Zeilen nebeneinander oder seriell. | Einfache Listen und positionsbezogene Tabellen. | Keine Schlüssel- oder Inhaltsverknüpfung.

cat | Gibt Dateien nacheinander aus. | Dateien vertikal anzeigen oder aneinanderhängen. | Die Dateien stehen untereinander, nicht als parallele Spalten.

join | Verknüpft Datensätze anhand gemeinsamer Felder oder Schlüssel. | Schlüsselbasierte Kombination strukturierter Dateien. | Benötigt passende Schlüssel und häufig sortierte Eingaben.

pr | Bereitet Text für Seiten- und Spaltendarstellung auf. | Druck- oder seitenorientierte Formatierung. | Dient primär der Darstellung, nicht der einfachen Datenkombination.

expand | Wandelt Tabulatoren in Leerzeichen um. | Tabulatoren für bestimmte Ausgaben ersetzen. | Führt keine Dateien oder Datenquellen zusammen.

column | Formatiert getrennte Daten in lesbare Spalten. | Terminalanzeige tabellarisch ausrichten. | Ist vor allem Darstellungshilfe, nicht der Ersatz für paste.

Portabilität und Varianten

Die grundlegenden Optionen -d und -s gehören zur verbreiteten POSIX-Funktionalität und sind auf vielen Unix- und Linux-Systemen verfügbar. Langoptionen wie --delimiters und --serial sowie weitere Optionen können von der konkreten Implementierung abhängen.

Auch die Auswertung von Escape-Sequenzen und oktalen Schreibweisen kann sich zwischen Implementierungen unterscheiden. Wenn ein Skript portabel sein soll, verwende die lokale Handbuchseite, zum Beispiel:

man paste

Prüfe insbesondere Sonderzeichen mit kleinen Beispieldateien, bevor du einen Befehl in produktive Automatisierung übernimmst.

Fehlerbehebung

Spalten wirken im Terminal nicht bündig

Tabulatoren springen zu Tabstopps. Unterschiedlich lange Werte oder Sonderzeichen können deshalb eine ungleichmäßige Darstellung verursachen. Prüfe, ob tatsächlich Tabulatoren verwendet werden, und nutze für die Anzeige column -t. Für Weiterverarbeitung sollte ein klar definiertes Trennzeichen vereinbart werden.

Es gibt mehr Zeilen oder leere Felder

Wahrscheinlich haben die Eingabedateien unterschiedliche Zeilenzahlen. Kontrolliere sie mit wc -l. Fehlende Werte müssen bewusst behandelt werden; paste ergänzt keine Inhalte und entfernt keine überzähligen Zeilen.

Die erzeugte CSV-Datei ist nicht korrekt

paste setzt nur Trennzeichen ein. Werte mit Kommas, Anführungszeichen oder Zeilenumbrüchen werden nicht automatisch nach CSV-Regeln maskiert oder quotiert. Verwende paste daher nur für einfache, kontrollierte Werte oder ein Werkzeug, das echtes CSV-Quoting unterstützt.

Werte stehen untereinander

Bei cat werden Dateien grundsätzlich nacheinander ausgegeben. Auch paste -s arbeitet seriell und ist daher für das Nebeneinanderstellen gleich nummerierter Zeilen ungeeignet. Verwende für diesen Fall paste ohne -s.

Paare passen fachlich nicht zusammen

paste koppelt ausschließlich nach Position. Wenn Datensätze über eine ID oder einen Namen verbunden werden sollen, nutze join, awk oder ein anderes schlüsselbasiertes Werkzeug. Ein vorheriges sort ist nur dann korrekt, wenn dadurch die gewünschte Zuordnung entsteht.

Sonderzeichen werden falsch interpretiert

Die Ursache kann Shell-Quoting oder implementationsabhängige Escape-Verarbeitung sein. Setze einfache Anführungszeichen passend ein, prüfe die lokale man paste-Dokumentation und validiere das Ergebnis mit kleinen Testdaten.

Prüfungsrelevante Merksätze

  • paste verbindet standardmäßig gleich nummerierte Zeilen parallel.
  • Jede Eingabedatei liefert ein logisches Feld; die Argumentreihenfolge bestimmt die Feldreihenfolge.
  • Der Standard-Delimiter ist ein Tabulator.
  • -d ändert die Trennzeichen, -s aktiviert den seriellen Modus.
  • - liest an dieser Stelle aus der Standardeingabe.
  • paste arbeitet positionsbezogen, nicht schlüsselbezogen.
  • column -t verbessert die Anzeige, ist aber keine Datenverknüpfung.
  • Einfache Trennzeichen-Ausgabe ist nicht automatisch eine vollständig gültige CSV-Datei.

Weitere passende Lektionen: paste-Befehl.