Re: AWK - Spalten über Namen statt über Position ansprechen
Andre Tann <atann@alphasrv.net> wrote:
> nur ne kurze Frage - sehe ich es richtig, daß es in AWK keine
> Möglichkeit gibt, Spalten bzw. Felder über ihren Namen anzusprechen
> statt über die Position?
Ich kenne awk nur rudimentär, aber gemäß man-page würde ich es auch so
sehen:
Each field in the input record may be referenced by its position,
$1, $2, and so on. $0 is the whole record.
> Also zB:
> Name Aktiv Nummer
> Alice y 1
> Bob n 2
> awk '$Aktiv == "y" {print $Nummer}'
> Sprich: gib mir die Nummer aller aktiven User.
Das kann, denke ich, so gar nicht funktionieren, weil "Nummer" meines
Erachtens für awk kein Feldbezeichner, sondern nur der Inhalt eines
Feldes ist.
> Hintergrund meiner Frage: meine Quelltabelle ist nicht stabil, was die
> Reihenfolge und Position der Spalten angeht. Aber die
> Spaltenbezeichnungen sind schon stabil. Daher würde ich gerne eben über
> die Bezeichnung ansprechen.
Mir fallen zwei Möglichkeiten ein:
a) Die Quelltabelle spaltenweise vorsortieren, so dass "Nummer" immer
an einer festen Position steht. Das lässt sich vermutlich auch in awk
erledigen, wie, müsste ich aber auch nachlesen.
b) Einen Feldbezeichner einführen. Also z.B. so, dass Du alle Felder
nach dem String "Nummer" durchsuchst und der Variable "Nummer" dann
diese Position zuweist. Habe mal auf die Schnelle das hier getestet:
martinkl@mort:~$ cat bsp1
Name Aktiv Nummer
a y 1
b n 2
martinkl@mort:~$ cat bsp2
Name Nummer Aktiv
a 1 y
b 2 n
martinkl@mort:~$ cat bsp1 | awk '{for (i=1;i<=NF;i++) if ($i=="Nummer") Nummer=i ; print $Nummer}'
Nummer
1
2
martinkl@mort:~$ cat bsp2 | awk '{for (i=1;i<=NF;i++) if ($i=="Nummer") Nummer=i ; print $Nummer}'
Nummer
1
2
Grundsätzlich würde es so also funktionieren, Du müsstest nur noch
die Zeile mit den "Feldbezeichnern" und den Rest der Datei separat
behandeln.
HTH, Martin
Reply to: