[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: