concat

Das concat-Kommando (Alias cat) liest Datensätze direkt von der Standardeingabe (stdin) oder aus Dateien ein und fügt diese zusammen. Die Ausgabe kann entweder in eine Datei oder in die Standardausgabe (stdout) geschrieben werden.

Der wichtigste Anwendungsfall des Kommandos besteht in Kombination mit den Kommandos partition oder split, da mittels concat das Ergebnis dieser Kommandos (teil-)rückgängig gemacht werden kann. Häufig macht es Sinn, eine große Datei in viele kleinere Dateien anhand eines Kriteriums zu teilen (bspw. nach der Sprache), um anschließend einzelne Dateien wieder zusammenzufügen.

Das folgende Beispiel fügt die Datensätze aus den Dateien ger.dat und eng.dat zu einer Datei ger_eng.dat zusammen:

$ pica concat -u ger.dat eng.dat -o ger_eng.dat

Optionen

-s, --skip-invalid
Überspringt jene Zeilen aus der Eingabe, die nicht dekodiert werden konnten.
-u, --unique
Es werden keine Duplikate in die Ausgabe geschrieben. Die Strategie zur Erkennung von Duplikaten wird mittels der Option --unique-strategy festgelegt.
--unique-strategy <STRATEGY>
Festlegen, wie Duplikate erkannt werden sollen. Standardmäßig ist der Wert idn ausgewählt, der Duplikate anhand der PPN aus dem Feld 003@.0 erkannt. Alternativ kann die Strategie hash gewählt werden. Der Vergleich erfolgt dann über die SHA-256 Prüfsumme der Datensätze.
--append
Wenn die Ausgabedatei bereits existiert, wird die Ausgabe an die Datei angehangen. Ist das Flag nicht gesetzt, wird eine bestehende Datei standardmäßig überschrieben.
--tee <filename>
Abzweigen der Ausgabe in eine zusätzliche Datei.
-p, --progress
Anzeige des Fortschritts, der die Anzahl der eingelesenen gültigen sowie invaliden Datensätze anzeigt. Das Aktivieren der Option erfordert das Schreiben der Datensätze in eine Datei mittels -o bzw. --output.
-o, --output
Angabe, in welche Datei die Ausgabe geschrieben werden soll. Standardmäßig wird die Ausgabe in die Standardausgabe stdout geschrieben. Endet der Dateiname mit dem Suffix .gz, wird die Ausgabe automatisch im Gzip-Format komprimiert.

Beispiele

Überspringen ungültiger Datensätze

Der eingangs verwendete Befehl geht davon aus, dass die zwei Partitionen ausschließlich gültige Datensätze enthalten. Gültig in diesem Zusammenhang bedeutet, dass es sich um valide Datensätze im Format PICA+ handelt und nicht ob ein Datensatz einem bestimmten Regelwerk entspricht.

Das Ausschließen von ungültigen Datensätzen wird mit der Option -s oder --skip-invalid erreicht:

$ pica concat --skip-invalid DUMP.dat.gz -o dump_valid.dat
$ pica concat -s DUMP.dat.gz --output dump_valid.dat.gz

Alternativ lässt sich das Überspringen ungültiger Datensätze mittels des config-Kommandos einstellen.

Lesen von der Standardeingabe

Das Kommando kann auch direkt von der Standardeingabe (stdin) lesen. Das ist bspw. dann hilfreich, wenn die Ausgabe aus einem vorhergehenden Pipeline-Schritt mit dem Inhalt einer oder mehrerer Dateien konkateniert werden soll.

Das folgende Beispiel liest im ersten Pipeline-Schritt die Datei dump1.dat ein, entfernt ungültige Datensätze und gibt die Ausgabe nach stdout aus. Der zweite Pipeline-Schritt liest diese Datensätze ein (-) und konkateniert diese mit den Datensätzen aus der Datei dump2.dat. Das Ergebnis wird in die Datei out.dat geschrieben.

$ pica concat -s dump1.dat | pica cat - dump2.dat -o out.dat

Der Dateiname - steht für die Standardeingabe (stdin). Wären die zwei Argumente vertauscht (pica cat dump2.dat -), dann würden erst die gültigen Datensätze aus der Datei dump1.dat und anschließend die Datensätze aus dem ersten Pipeline-Schritt geschrieben.

Hinzufügen von Datensätzen

Wenn eine Ausgabedatei bereits existiert, wird diese standardmäßig neu angelegt und überschrieben. Soll das Verhalten dahingehend geändert werden, dass an die bestehenden Dateien angehangen wird, kann dies mit der --append-Option erreicht werden. Diese Option ändert das Verhalten von --output und --tee. Die Option hat auf das Verhalten beim Schreiben in die Standardausgabe keine Auswirkung.

Im folgenden Beispiel erzeugt der erste Befehl eine neue Datei gnd.dat. Sollte die Datei bereits existieren, wird der Datei-Inhalt überschrieben. Die darauffolgenden Kommandos hängen jeweils an das Ende der Datei gnd.dat an.

$ pica concat Tp*.dat -o gnd.dat
$ pica concat --append Ts*.dat -o gnd.dat
$ pica concat --append Tu*.dat -o gnd.dat
...

Abzweigen der Ausgabe

Gelegenlich kann es nützlich sein, die Ausgabe des concat-Kommandos in eine Datei zu schreiben und gleichzeitig die Ausgabe an einen weiteren Pipeline-Schritt weiterzureichen. Dies hat den Vorteil, dass zwei CPU-Kerne gleichzeitig genutzt werden können. Mit der --tee-Option lässt sich dieses Verhalten erzielen. Der Name der Option leitet sich von dem T-Stück (engl. tee connector) ab, mit dem ein Klempner eine Abzeigung in eine Leitung einbaut.

Im folgenden Beispiel werden alle Tp*.dat zusammengefügt und in eine Datei Tp.dat geschrieben. Gleichzeitig werden alle Datensätze mit dem filter-Kommando nach der Satzart Tp2 im Feld 002@.0 gefiltert.

$ pica concat partitions/Tp*.dat --tee gnd_person.dat | \
    pica filter "002@.0 =^ 'Tp2'" -o Tp2.dat

Entfernen von Duplikaten

Duplikate können durch die Angabe des Flags --unique (-u) entfernt werden. Standardmäßig erfolgt die Erkennung von Duplikaten per PPN aus dem Feld 003@.0 . Alternativ kann durch die Angabe der Option --unique-strategy die Variante hash ausgewählt werden, bei der nur solche Datensätze als gleich gewertet werden, bei denen alle Bytes gleich sind.

$ pica concat --unique --unique-strategy hash ger.dat eng.dat -o out.dat
$ pica concat --unique --unique-strategy idn ger.dat eng.dat -o out.dat