Gelegentlich verwende ich das Kommando cut
, um aus Dateien
oder Programmausgaben gewisse Komponenten auszuschneiden
und dann weiterzuverwenden.
Leider stellt sich heraus, dass die Option “-c” Probleme mit UTF-8-Dateien hat!
TLDR: Die aktuelle Version von GNU-CUT behandelt “-c” genauso wie “-b”. Getestet mit Ubuntu-20.04.
Ein einfaches Beispiel
Ich habe diese Datei:
1 2 3 4 5 |
|
Aus dieser Datei möchte ich die Spalten
08 bis 13 ausscheiden und das mache ich
mit cut -c8-13 <dateiname
.
1 2 3 4 5 |
|
Das Ergebnis entspricht den Erwartungen
Gleiche Datei “in Grün”
Hier der gleiche Ablauf mit einer leicht modifizierten Datei:
1 2 3 4 5 |
|
Es ist lediglich die Zeile mit “GRÜN” dazugekommen. Erwarten würde ich Ausgaben wie diese:
1 2 3 4 5 6 |
|
Das reale Ergebnis unter Ubuntu-20.04 sieht so aus:
1 2 3 4 5 6 |
|
Es fällt auf, dass statt “GRÜN-2” die Zeichenkette
“ GRÜN” ausgegeben wird. Scheinbar verhält sich cut -c8-13 ...
genauso wie cut -b8-13 ...
.
Recherchen
Via Google habe ich diese beiden Stellen gefunden:
Daraus geht hervor, dass für GNU-CUT die Optionen “-c” und “-b” gleichartig funktionieren. Das erklärt, warum auch die Ergebnisse/Ausgaben gleichartig sind!
Test mit “uutils/coreutils”
uutils coreutils enthält eine Neuimplementierung von CUT. Ich teste wie folgt:
- Auschecken:
git clone git@github.com:uutils/coreutils.git
- Wechseln in’s Verzeichnis:
cd coreutils
- Bauen:
cargo build
- Ausführen:
target/release/cut -h
–> Hilfeseite
Test mit der Datei von oben:
1 2 3 4 5 6 |
|
Gleiches Verhalten wie bei GNU-CUT! Kurzsichtung des Quelltextes zeigt, dass es eine Methode “cut_bytes” gibt aber keine Methode “cut_characters” (oder so ähnlich). Also Vermutung: “-c” wurde nicht richtig implementiert!
Notbehelf mit BASH
Mit der BASH kann das gewünschte Verhalten von CUT einfach mit Bordmitteln nachprogrammiert werden:
1 2 3 4 5 6 7 8 9 10 |
|
Das Skript speichere ich unter dem Namen “bash-cut.sh” und mache es ausführbar mit chmod +x bash-cut.sh
.
Damit sieht Ausgabe dann so aus:
1 2 3 4 5 6 |
|
Der Notbehelf funktioniert also!
Links
- 4 Essential and Practical Usage of Cut Command in Linux
- 8.1 cut: Print selected parts of lines
- uutils coreutils
Änderungen
- 2022-01-10: Erste Version