(G)awk kann Zahlenkolonnen schick formatieren, sodass z.B. die Kommastellen sauber untereinander platziert werden. Die Ausgangsdatei, datei.txt, hat folgenden Inhalt:
13.5 556.987
14.56 13.1
15.356 345.2
416.106 2.7
17.1 3.99
18.41 4.342
139.14 345.2
20.21 20.1
621.18 4.5
22.01 77.2
23.1 94.627
Das sieht nicht so toll aus... Mit Müh und Not kann man zwei Spalten mit Fließkommazahlen erkennen, jeweils durch ein Leerzeichen getrennt. Gawk wirds richten:
cat datei.txt | gawk '{printf("%7.3f", $1); printf("%7.3f\n", $2)}'
Ergebnis:
13.500556.987
14.560 13.100
15.356345.200
416.106 2.700
17.100 3.990
18.410 4.342
139.140345.200
20.210 20.100
621.180 4.500
22.010 77.200
23.100 94.627
Die C-Funktion printf hat schon mal ganze Arbeit geleistet.
%7.3f bedeutet
7 signifikante Stellen insgesamt (Vorsicht, das Kommazeichen wird auch mitgezählt),
3 Nachkommastellen, als
f (=float, =Fließkommazahl) darstellen. Vor dem Komma wird mit Leerzeichen aufgefüllt, nach dem Komma mit Nullen.
Printf wird zwei mal aufgerufen, einmal für jedes Feld der Zeile (zwei sind es ja). Beim zweiten Aufruf wird noch ein Zeilenumbruch hinten angehängt (\n). Gawk's normales Feldtrennzeichen ist Whitespace, also Leerzeichen oder Tabulator, deshalb muss ich es nicht extra angeben.
$1 und
$2 sind die Variablen, die gawk für die Felder (=Zahlen) verwendet ($0 wäre die ganze Zeile).
Die Formatierung kann ich natürlich noch beliebig verfeinern, ein Beispiel:
cat datei.txt | gawk '{printf("%9.3f \xE2\x82\xAC =>", $1); printf("%9.3f \xE2\x82\xAC\n", $2)}'
%9.3f -- durch insgesamt 9 Stellen schaffe ich vor den Zahlen noch etwas mehr Platz.
\xE2\x82\xAC -- ist die Escapesequenz für das Eurozeichen (hexadezimal).
=> -- innerhalb der doppelten Hochkomma kann ich so ziemlich alles mit einfügen.
Ergebnis:
13.500 € => 556.987 €
14.560 € => 13.100 €
15.356 € => 345.200 €
416.106 € => 2.700 €
17.100 € => 3.990 €
18.410 € => 4.342 €
139.140 € => 345.200 €
20.210 € => 20.100 €
621.180 € => 4.500 €
22.010 € => 77.200 €
23.100 € => 94.627 €
Sollte ich feststellen, dass ich nur zwei Nachkommastellen brauche, ist das überhaupt kein Problem, gawk rundet dabei auch korrekt und schneidet nicht nur einfach hinten was ab:
cat datei.txt | gawk '{printf("%9.2f \xE2\x82\xAC", $1); printf("%9.2f \xE2\x82\xAC\n", $2)}'
Ergebnis:
13.50 € 556.99 €
14.56 € 13.10 €
15.36 € 345.20 €
416.11 € 2.70 €
17.10 € 3.99 €
18.41 € 4.34 €
139.14 € 345.20 €
20.21 € 20.10 €
621.18 € 4.50 €
22.01 € 77.20 €
23.10 € 94.63 €
So kann ich die Ausgabe eines Skriptes (eines Cronjobs) hübsch formatieren und als Mail versenden - nur so als Beispiel.
Klar funktioniert das auch mit Ganzzahlen (Integer), dazu kann dann einfach
i statt
f verwendet werden, also:
cat datei.txt | gawk '{printf("%5i $", $1); printf("%5.0f $\n", $2)}'
Der Unterschied zwischen dem ersten und dem zweiten Aufruf von printf liegt in der Rundung:
%5i -- Integer, nach dem Komma wird einfach abgeschnitten.
%5.0f -- Float, keine Nachkommastelle, aber korrekte Rundung.
Ergebnis:
13 $ 557 $
14 $ 13 $
15 $ 345 $
416 $ 3 $
17 $ 4 $
18 $ 4 $
139 $ 345 $
20 $ 20 $
621 $ 4 $
22 $ 77 $
23 $ 95 $
Ein flinker Währungswechsel außerdem...