Samstag, 14. März 2009
Formatieren mit Bashbuiltin printf
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":
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:
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,627Diese 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:
"Formatieren mit Bashbuiltin printf" vollständig lesen
Skriptoptionen mit getopts
Viele Shellprogramme haben Optionen, die das Verhalten des Programmes anpassen. Aber wie wird sowas umgesetzt? Am einfachsten mit dem Bashbuiltin getopts (nicht zu verwechseln mit dem Programm "getopt", das etwas Ähnliches macht).
Ein einfaches Beispiel: ein Skript mit vier Optionen.
Sollen sich die Optionen gegenseitig ausschließen, muss das extra geprüft werden. Z.B. mit einem Counter:
Ein einfaches Beispiel: ein Skript mit vier Optionen.
#!/bin/bash
usage="Usage: ein Hilfetext..."
while getopts "abch" options; do
case $options in
a ) echo 'option -a gesetzt';;
b ) echo 'option -b gesetzt';;
c ) echo 'option -c gesetzt';;
h ) echo $usage
exit 0
;;
\? ) echo $usage
exit 1
;;
esac
done
Obiges Skript hat vier Optionen -a, -b, -c und -h für einen Hilfetext. Alle Optionen dürfen gleichzeitig gesetzt werden, auch mehrfach und zwar immer in beliebiger Reihenfolge. Keine der Optionen erfordert einen Parameter. Nur wenn eine unbekannte Option, etwa -x gesetzt wird, tritt ein Fehler auf, das Skript wird dann sofort beendet und ein kleiner Hilfetext ausgegeben.usage="Usage: ein Hilfetext..."
while getopts "abch" options; do
case $options in
a ) echo 'option -a gesetzt';;
b ) echo 'option -b gesetzt';;
c ) echo 'option -c gesetzt';;
h ) echo $usage
exit 0
;;
\? ) echo $usage
exit 1
;;
esac
done
Sollen sich die Optionen gegenseitig ausschließen, muss das extra geprüft werden. Z.B. mit einem Counter:
"Skriptoptionen mit getopts" vollständig lesen
(Seite 1 von 1, insgesamt 2 Einträge)