|
Konstante, Variable, Sätze und Felder
awk kennt keine echten Datentypen, es wird nur mit Strings
gearbeitet. Diese werden allerdings als Zahlen aufgefaßt, wenn das imZusammenhang sinnvoll ist. - Soll die Auswertung als Zahl erzwungen werden, so addiert man eine 0 (string + 0).
- Soll die Auswertung als String erzwungen werden, so hängt man einen Leerstring an (zahl "").
Konstante
Zwei Arten von Konstanten können auftreten:
- String-Konstante
Eine Zeichenkette in Gänsefüßchen eingeschlossen. Im Gegensatz
zur Shell findet keine Interpretation statt. So können auch die
üblichen Escape-Sequenzen benutzt werden.
- numerische Konstante
Hierunter versteht man in diesem Zusammenhang alle ganzen Zahlen und
Gleitkommazahlen wie 3.14 oder 1.6021892e-19. Intern werden alle Zahlen als
Gleitkommazahlen gespeichert. Die Genauigkeit ist natürlich
maschinenabhängig.
Variable
awk verwendet dynamische Variable. Diese brauchen nicht deklariert zu
werden und können Strings oder Gleitkommawerte enthalten.
Variablen können sowohl Strings, als auch numerische Werte beinhalten. Es
muß ihnen kein expliziter Datentyp zugeordnet werden. Während eines
Programmablaufs kann dieselbe Variable sowohl Strings, als auch numerische Werte
speichern. Der Typ einer Variablen wird immer aus dem Kontext bestimmt. Hierbei
werden ggf. Umwandlungen gemäß OFMT vorgenommen. Jede Variable
wird mit einem Nullstring bzw. mit Null initialisiert.
In Ausdrücken können 3 Arten von Variablen verwendet werden:
- vom Benutzer gewählte Variablen
Variablen können aus Buchstaben, Ziffern und Unterstrich bestehen.
Das erste Zeichen muß ein Buchstabe oder der Unterstrich sein!
- Feld-Variablen
Feld-Variablen setzen sich aus $ und der Feldnummer zusammen. In
$0 wird aktuelle Eingabezeile (Rekord) abgelegt. $0 ist oft voreingestelltes
Argument bei Funktionen, beispielsweise bei print.
Der aktuelle Record wird gemäß FS (Feldtrennzeichen) in die Felder
$1...$NF zerlegt (NF - Anzahl der Felder des Satzes).
Feld-Variablen können genau so wie andere Variablen behandelt werden,
insbesondere können ihnen auch neue Werte zugewiesen werden. Diese
Zuweisungen beeinflussen $0 und NF!
Feld-Variablen können auch unter Verwendung von Ausdrücken angegeben
werden: $(NF-1) ist beispielsweise das vorletzte Feld der Eingabezeile.
- built-in Variablen
Built-in Variablen sind Variablen die awk zur Verfügung stellt und
mit Werten belegt. Sie geben Auskunft über den momentanen
Programmzustand (siehe 9.3.3).
Sätze
Sätze entsprechen normalerweise Zeilen, sie werden also durch das LF
voneinander getrennt. Man kann aber auch durch Setzen der speziellen Variable
RS einen anderen Satztrenner festlegen. Wird RS mit einer
leeren Zeichenkette belegt, so werden Sätze durch Leerzeilen getrennt.
Beim Lesen eines Satzes wird dieser von awk in Felder zerlegt. Die
Trennung erfolgt normalerweise durch Whitespace (Leerzeichen oder
Tabulatoren), kann aber durch Setzen der Variable FS anders geregelt
werden. Wird FS mit einer leeren Zeichenkette belegt, so wird aus
jedem einzelnen Zeichen ein Feld.
Enthalten RS und FS mehr als ein Zeichen, so wird ihr Inhalt
als regulärer Ausdruck aufgefaßt. Oft findet man auch awk-Aufrufe folgender Gestalt:
awk -v 'FS=^\"?|\"?,\"?|\"?$' '{print $3, $2}' datei
Hier wird die Zuweisung der Variable FS auf der Kommandozeile
vorgenommen. Der oben angegebene Ausdruck zerlegt CSV-Dateien, wie sie von
Excel oder dBase exportiert werden, in einzelne Felder.
Arrays (Vektoren)
awk verfügt über ein- und mehrdimensionale Vektoren. Diese
weisen zwei Besonderheiten auf:
- Die Größe eines Vektors muß nicht explizit angegeben
werden. Neue Elemente werden einfach eingefügt. Elemente werden durch
ihren Index bestimmt. Existiert ein Index noch nicht, so wird dieser mit
entsprechendem Wert in den Vektor eingetragen.
- Neben den einfachen Strings kennt awk noch assoziative Arrays. Die
Indizes eines solchen Arrays sind Strings, z. B.
a["Fred"] = "Feuerstein".
Ein Vektorelement wird durch vektor [index] angesprochen oder
initialisiert.
Beispiel: Zählen von Worten
{
gsub(/[.,:;!?(){}-+]/,"") # Interpunktionszeichen weg
for (i=1 ; i<=NF ; i++)
feld[i]=feld[i]+1
}
END {
for (i in feld)
print i, feld[i]
}
Mehrdimensionale Vektoren verhalten sich wie eindimensionale Vektoren. Intern
werden sie zu solchen mit Hilfe von SUBSEP umgeformt. Die Indizes werden
durch Kommata voneinander getrennt. Im Zusammenhang mit Operatoren sollten die
Tupel mit runden Klammern eingeschlossen werden, z. B.:
if ((i,j,k) in vektor)
|
|
|