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

Re: AWK - Spalten über Namen statt über Position ansprechen



Martin Klaiber <martinkl@zedat.fu-berlin.de> wrote:
> Andre Tann <atann@alphasrv.net> wrote:

>> 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.

Man könnte es m.E. auch noch erweitern: Für awk ist die obenstehenden
Tabelle gar keine Tabelle, sondern einfach drei Zeilen, die in jeweils
drei Felder zerlegt werden. Die Verknüpfung von "Nummer" mit 1 oder 2
kann also nur über die Position erfolgen, denn das ist für awk das
einzige, was die drei Zeilen gemeinsam haben.

> 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.

Eigentlich müsste es auch so funktionieren, wenn man Deine Bedingung
ergänzt, vorausgesetzt, die Zeile mit Deinen "Feldbezeichnern" steht
immer an erster Stelle in der Datei:

   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 ; else if ($i=="Aktiv") Aktiv=i; if ($Aktiv=="y") print $Nummer}'
   1
   martinkl@mort:~$ cat bsp2 | awk '{for (i=1;i<=NF;i++) if ($i=="Nummer") Nummer=i ; else if ($i=="Aktiv") Aktiv=i; if ($Aktiv=="y") print $Nummer}'
   1

Ein awk-Experte kann das sicher noch schöner formulieren, bin selbst
nur awk-Gelegenheitsnutzer.

Gruß, Martin


Reply to: