awk und sortierte Ausgabe

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

awk und sortierte Ausgabe

Beitrag von Duff » 29.10.2009 12:13:21

Hallo,

nachdem ich den Vorlesung von meillo gesehen habe, möchte ich wieder etwas mehr mit awk arbeiten ;-)

Ich habe folgendes awk-Skript gebastelt:

Code: Alles auswählen

#!/usr/bin/awk -f
BEGIN {
        FS=" ";
        j=0;
}

/^The following/ {
        while(getline != /upgraded\.$/) {
                for(i=1; i<=NF; i++) {
                        array[j]=$i;
                        j++;
                }
        }
        num=j;
}

END {
        print "Number of packages to upgrade: ",num;
        for(k in array) {
                printf("  %-s\n",array[k]);
        }
}
Dieses awk-Skript wird in Verbindung mit einem apt-get -s upgrade aufgerufen und soll mir alle Pakete anzeigen (untereinander), die geupgraded werden sollen.
Doch leider ist meine Liste nicht sortiert.

Wie gehe ich am besten vor?
(Will kein | sort... benutzen)

Code: Alles auswählen

duff:~/scripts# apt-get -s upgrade |awk -f apt-upgrade.awk
Number of packages to upgrade:  28
  libisc45
  libisccc40
  libisccfg40
  libxml2
  liblwres40
  linux-headers-2.6.26-2-686
  libnewt0.52
  linux-headers-2.6.26-2-common
  libruby1.8
  linux-image-2.6.26-1-686
  libsmbclient
  linux-image-2.6.26-2-686
  libssl0.9.8
  linux-libc-dev
  libtiff4
  wget
  libwbclient0
  whiptail
  bind9-host
  dbus
  dbus-x11
  dhcp3-client
  dhcp3-common
  dnsutils
  libbind9-40
  libdbus-1-3
  libdns45
  libexpat1
Oh, yeah!

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: awk und sortierte Ausgabe

Beitrag von GoKi » 29.10.2009 12:39:31

Duff hat geschrieben:(Will kein | sort... benutzen)
gawk hat asort.
http://www.gnu.org/manual/gawk/html_nod ... rting.html
MfG GoKi
:wq

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: awk und sortierte Ausgabe

Beitrag von Duff » 29.10.2009 13:00:49

Danke, habe aber kein gawk auf meinem lenny installiert.
awk ist ein Link auf mawk.
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk und sortierte Ausgabe

Beitrag von Meillo » 29.10.2009 14:37:34

Duff hat geschrieben:Doch leider ist meine Liste nicht sortiert.

Wie gehe ich am besten vor?
(Will kein | sort... benutzen)
Weshalb nicht?

Sonst bleibt nur von Hand zu sortieren, denn awk hat kein sort().
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: awk und sortierte Ausgabe

Beitrag von Duff » 29.10.2009 15:58:35

Meillo hat geschrieben: Weshalb nicht?
Wollte noch Text mit ausgeben, der dann auch mit in der Sortierung einbezogen wird.
Meillo hat geschrieben: Sonst bleibt nur von Hand zu sortieren, denn awk hat kein sort().
Schade.
Dann werde ich mir eventuell eine Funktion schreiben müssen.
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk und sortierte Ausgabe

Beitrag von Meillo » 29.10.2009 16:08:44

Duff hat geschrieben:
Meillo hat geschrieben: Weshalb nicht?
Wollte noch Text mit ausgeben, der dann auch mit in der Sortierung einbezogen wird.
Zwischen rein? Denn am Anfang oder am Ende ist ja kein Problem.
Meillo hat geschrieben: Sonst bleibt nur von Hand zu sortieren, denn awk hat kein sort().
Schade.
Dann werde ich mir eventuell eine Funktion schreiben müssen.
Da reicht ja ein einfaches Bubble-Sort, dessen paar Zeilen man einfach so runter tippen kann.
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: awk und sortierte Ausgabe

Beitrag von Duff » 29.10.2009 17:24:36

Meillo hat geschrieben: Zwischen rein? Denn am Anfang oder am Ende ist ja kein Problem.
Eigentlich am Anfang.
Meillo hat geschrieben: Da reicht ja ein einfaches Bubble-Sort, dessen paar Zeilen man einfach so runter tippen kann.
Werde ich mir morgen mal anschauen.
Mal schau'n, ob ich es hinbekomme.
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk und sortierte Ausgabe

Beitrag von Meillo » 29.10.2009 17:36:01

Duff hat geschrieben:
Meillo hat geschrieben: Zwischen rein? Denn am Anfang oder am Ende ist ja kein Problem.
Eigentlich am Anfang.
Dann mach's doch mit sort. Etwa so:

Code: Alles auswählen

awk 'BEGIN {
  print "leading text";
  a["d"]; a["f"]; a["b"]; a["a"]; a["c"]; a["e"];
  for (i in a) {
    print i | "sort";
  }
}'
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: awk und sortierte Ausgabe

Beitrag von Duff » 30.10.2009 08:22:57

Danke, so funktioniert es.

Aber wieso funktioniert es so?
Ich durchlaufe doch die for-Schleife und dann gebe ich jeden Wert einzeln aus und hänge dort das sort an.
Wieso wird über alle Elemente des Arrays sortiert?
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk und sortierte Ausgabe

Beitrag von Meillo » 30.10.2009 09:40:04

Duff hat geschrieben:Aber wieso funktioniert es so?
Ich durchlaufe doch die for-Schleife und dann gebe ich jeden Wert einzeln aus und hänge dort das sort an.
Wieso wird über alle Elemente des Arrays sortiert?
Die SUS erklärt es:
http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html hat geschrieben: The third form shall write output onto a stream piped to the input of a command. The stream shall be created if no stream is currently open with the value of expression as its command name. The stream created shall be equivalent to one created by a call to the popen() function defined in the System Interfaces volume of IEEE Std 1003.1-2001 with the value of expression as the command argument and a value of w as the mode argument. As long as the stream remains open, subsequent calls in which expression evaluates to the same string value shall write output to the existing stream. The stream shall remain open until the close function (see Input/Output and General Functions) is called with an expression that evaluates to the same string value. At that time, the stream shall be closed as if by a call to the pclose() function defined in the System Interfaces volume of IEEE Std 1003.1-2001.
Use ed once in a while!

Antworten