Bash-Script: Template mit Inhalt aus zwei unterschiedlichen Quellen befüllen

Ich stand kürzlich vor dem Problem, ein Textdatei-Template aus zwei unterschiedlichen Datenquellen (Dateien) befüllen zu müssen. Weil das für circa 150 000 Input-Paare passieren sollte, war eine manuelle Bearbeitung ausgeschlossen und ich wollte die Sache mit einem kleinen Shell-Script erledigen. Nicht gerade meine Paradedisziplin, aber dank der Mithilfe eines Arbeitskollegen habe ich doch noch eine Lösung finden können.

Das Prinzip dieser Lösung möchte ich an dieser Stelle Anhand eines kleinen Beispiels erklären. In der Ausgangssituation gibt es insgesamt drei Textdateien.

  1. Template.txt
  2. Names.txt
  3. Pets.txt

In Datei 1 steht ein Satz, der an zwei Stellen mit den entsprechenden Zeilen aus den Dateien 2 und 3 ersetzt werden soll.

mkriesten$ cat Template.txt
Mein Name ist PERSON und mein Haustier ist ein PET.

mkriesten$ cat Names.txt
Karl
Klara
Karo
Knut

mkriesten$ cat Pets.txt
Vogel
Kater
Hase
Hund

Das gewünschte Ergebnis ist also folgendes:
Mein Name ist Karl und mein Haustier ist ein Vogel.
Mein Name ist Klara und mein Haustier ist ein Kater.
Mein Name ist Karo und mein Haustier ist ein Hase.
Mein Name ist Knut und mein Haustier ist ein Hund.

Um diese Aufgabe zu erledigen habe ich dann folgende Zeilen geschrieben:

mkriesten$ cat Script.txt
#!/bin/bash
count=0
for i in $(cat Names.txt); do
((count++))
m=$(sed -n “$count’p‘ Pets.txt)
sed ’s/PERSON/’$i’/g‘ Template.txt | sed ’s/PET/’$m’/‘
done

Eine kurze Erklärung (auch wenn das Schreiben von Prosa hier weh tut):
Das Script erstellt erst einen Counter „$count“ und setzt den Ausgangswert auf 0. Danach geht es in eine for-Schleife, die Zeile für Zeile die Datei „Names.txt“ abarbeitet und den entsprechenden Eintrag in der Variablen „$i“ speichert. In der ersten Zeile der Schleife wird der Counter auf 1 gesetzt, danach eine Variable „$m“ erzeugt, die den Wert von Stelle „$count“ (im ersten Durchlauf Zeile 1, im zweiten Durchlauf Zeile 2, …) der Datei „Pets.txt“ beinhaltet. Danach werden die Strings „PERSON“ und „PET“ aus dem Template „Template.txt“ mit „$i“ und „$m“ ersetzt. Die Schleife geht weiter bis zur letzten Zeile von „Names.txt“.

Das Script tut was es soll, soviel steht fest. Wenn ihr allerdings eine elegantere Lösung dafür habt, wäre ich für die Aufklärung in einen Kommentar sehr dankbar.

 

mkriesten

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*