Wie man Zahlenkolonnen mit (g)awk formatiert, wurde im Beitrag
Zahlenkolonnen-formatieren-mit-gawk.html schon gezeigt. Wenn es nur um die Formatierung geht, und nicht gerechnet werden muss, geht das noch einfacher mit dem Bashbuiltin
printf.
Die Ausgangsdatei fürs erste Beispiel sei die "datei.txt":
13,5 556,987
14,56 13,1
15,356 345,2
16,106 2,7
17,1 3,99
18,41 4,342
19,14 345,2
20,21 20,1
21,18 4,5
22,01 77,2
23,1 94,627
Diese unordentliche Liste von Fließkommazahlen kann schön formatiert werden mit:
cat datei.txt | while read line; do printf "%7.2f -> %7.2f\n" $line; done
Immer vorausgesetzt, dass eure Umgebungsvariable $LANG bzw. $LC_NUMERIC mit den in der Datei verwendeten
Kommazeichen (Punkt oder Beistrich) übereinstimmt. Ist das nicht der Fall, gibt printf die Fehlermeldung "...invalid number" aus.
Was es mit den Anweisungen "%7.2f" usw. auf sich hat, lest bitte im oben genannten gawk-Beitrag nach (oder in der Manpage zu "sprintf"). Dann muss ich das hier nicht wiederholen. Gerundet wird übrigens korrekt.
In der "datei2.txt" werden Punkte als Kommazeichen verwendet. Damit die Zahlen korrekt als solche erkannt werden, mein $LANG ist ja "de_DE.UTF-8", muss ich also die zuständige Umgebungsvariable setzen:
LC_NUMERIC=C; cat datei2.txt | while read line; do printf "%7.2f -> %7.2f\n" $line; done
Ausgabe:
13.50 -> 556.99
14.56 -> 13.10
15.36 -> 345.20
16.11 -> 2.70
17.10 -> 3.99
18.41 -> 4.34
19.14 -> 345.20
20.21 -> 20.10
21.18 -> 4.50
22.01 -> 77.20
23.10 -> 94.63
Hinweis: die Variable bleibt gesetzt, bis sie wieder zurückgesetzt wird. Müsst ihr also in der selben Shell zwischen den Kommazeichen wechseln, solltet ihr jeweils LC_NUMERIC passend setzen, bzw. mit
unset LC_NUMERIC
die Umgebungsvariable zurücksetzen.
Anmerkung: die Datei darf wirklich nur Zahlen enthalten. Strings, also Text, würden von printf im obigen Beispiel zur Zahl "0.00" verwurstet. Das dürfte selten das gewünschte Ergebnis sein.
Klarerweise bringt printf aber auch Anweisungen für Strings oder Ganzzahlen oder Sonstiges mit. Für die Bash ungewohnt ist die Pingeligkeit, was den Typ der Variablen betrifft (printf kommt ja aus der C-Welt).
var="blubb 123 456"; printf "%s -> %5i -> %7.2f\n" $var
Ergebnis: blubb -> 123 -> 456,00
Also ein String (wie er ist),
dann ein Integer (auf 5 Stellen vorne mit Leerzeichen auffüllen),
dann ein Float (7 Stellen insgesamt, 2 Nachkommastellen)
var="blubb 123 456"; printf "%12s -> %x -> %o\n" $var
Ergebnis: blubb -> 7b -> 710
Also ein String (vorne mit Leerzeichen auf 12 Stellen auffüllen),
dann die Zahl 123 umwandeln in eine hexadezimale Zahl,
dann die Zahl 456 umwandeln in eine oktale Zahl.
var="blubberbla 123 456"; printf "%.4s -> %d -> %X\n" $var
Ergebnis: blub -> 123 -> 1C8
Also:
Nur 4 Zeichen des Strings,
dann der Integer,
dann die Zahl als hexadezimale, diesmal mit Großbuchstaben.
var="bla 123 456"; printf "%4s %0#6i -> %#x\n" $var
Ergebnis: bla 000123 -> 0x1c8
Also:
Den String vorne mit Leerzeichen auf 4 Stellen auffüllen,
dann den Integer vorne mit Nullen auf 6 Stellen auffüllen,
dann die Zahl in eine hexadezimale wandeln, mit vorangestelltem "0x".
Für alle Beispiele gilt: Innerhalb der doppelten Hochkomma darf so ziemlich alles stehen. Das wird dann genauso mit eingefügt, wie die im Beispiel verwendeten "->", z.B Währungszeichen o.ä.. Einzige Ausnahme ist das Prozentzeichen, das durch ein weiteres Prozentzeichen escaped werden muss (%%).