Kann mir jemand die Option -C von mapfile genauer erklären?
Die Built-in-Funktion mapfile (bzw. readarray) ist eine praktische Sache, z. B. lassen sich so über eine while-read-Schleife gut gleichförmige Werte in einer csv-Datei nutzen. Bei der Erkundung der verschiedenen Möglichkeiten bin ich jedoch bei der Option -C hängen geblieben.
Soweit ich das anhand von manpage und diversen Anleitungen herausfinden konnte, kann man mit der Option -c (Kleinbuchstabe) eine bestimmte Anzahl von Indizes einlesen, nach denen mit Hilfe der Option -C (Großbuchstabe) etwas eingefügt werden kann, das sich »Callback« nennt. Leider wurde mir jedoch nicht klar, was genau man mit diesem Callback bewirken kann. Anschauliche Beispiele dazu gibt es im Internet leider keine.
Kann mir jemand ein paar praktische Anwendungsfälle zeigen?
1 Antwort
Ein Callback ist einfach eine Funktion, die automatisch aufgerufen wird, wenn ein bestimmtes Ereignis eintritt – in diesem Fall jedes Mal, wenn "mapfile" eine neue Zeile liest.
Der Callback von mapfile ermöglicht es dir so, für jede Zeile, die eingelesen wird, eine Funktion (der Callback) aufzurufen. Diese Funktion kannst du verwenden, um die Zeilen zu bearbeiten oder eine andere Art der Verarbeitung durchzuführen.
Nehmen wir mal ein kleines Beispiel
callback() {
echo "${1//,/ }"
}
mapfile -C callback ABC.csv
Was passiert hier?
- Jede Zeile der CSV-Datei wird eingelesen.
- Die Callback-Funktion wird aufgerufen und ersetzt die Kommas durch Leerzeichen.
- Die veränderte Zeile wird ausgegeben
Perfekt, das hilft mir sogar in mehr als einer Hinsicht weiter:
- Die Schreibweise zum Ändern einer Zeile kannte ich noch nicht (bisher habe ich dafür immer sed eingespannt)
- Um die Semikola (deutsche locale der csv) loszuwerden, habe ich bisher bei mapfile immer die Option -t verwendet. Aber deine callback-function kann dazu verwendet werden, den newline am Ende jeder Zeile loszuwerden. Das hat mich bei der Ausgabe des letzten array-Index immer ein wenig gestört, und so hattte ich die csv-Datei ein wenig modifiziert: sed -i 's/$/;/' csv-Datei
Danke für den Tipp. 👍