nach dem zweiten Feld von rechts sortieren [geloest] (plus: awk lernen)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
heinz
Beiträge: 378
Registriert: 20.12.2007 01:43:49

nach dem zweiten Feld von rechts sortieren [geloest] (plus: awk lernen)

Beitrag von heinz » 08.10.2019 20:23:13

Hallo Zusammen,

ich suche nach einem Programm mit dem ich Dateinamen nach dem zweiten Feld von rechts sortieren kann.

Verzeichnisstruktur (Beispiel):

Code: Alles auswählen

/home/user/quellpfad
  datei_a.txt
  datei_z.txt
  ...
  unterpfad_test1
    datei_a.txt
    datei_z.txt
    ...
    unterpfad_von_test1
      datei_a.txt
      datei_z.txt
      ...
    weiterer_unterpfad_von_test1
      datei_a.txt
      datei_z.txt
      ...
  unterpfad_test2
    datei_a.txt
    datei_z.txt
    ...
  nochnpfad
    datei_a.txt
    datei_z.txt
    ...
    weiterer_pfad
      datei_a.txt
      datei_z.txt
      ...
Mit:

Code: Alles auswählen

find quellpfad -type f
bekomme ich die "unsortierte" Liste der Dateien.

Code: Alles auswählen

quellpfad/datei_z.txt
quellpfad/unterpfad_test2/datei_z.txt
quellpfad/unterpfad_test2/datei_a.txt
quellpfad/datei_a.txt
quellpfad/unterpfad_test1/datei_a.txt
quellpfad/unterpfad_test1/datei_z.txt
quellpfad/unterpfad_test1/weiterer_unterpfad_von_test1/datei_z.txt
quellpfad/unterpfad_test1/weiterer_unterpfad_von_test1/datei_a.txt
quellpfad/unterpfad_test1/unterpfad_von_test1/datei_z.txt
quellpfad/unterpfad_test1/unterpfad_von_test1/datei_a.txt
quellpfad/nochnpfad/weiterer_pfad/datei_a.txt
quellpfad/nochnpfad/weiterer_pfad/datei_z.txt
quellpfad/nochnpfad/datei_z.txt
quellpfad/nochnpfad/datei_a.txt
Diese Liste wuerde ich gerne "in einem Rutsch" nach den Namen des letzten unterpfades sortieren, damit sie so aussieht:

Code: Alles auswählen

quellpfad/nochnpfad/datei_a.txt
quellpfad/nochnpfad/datei_z.txt
quellpfad/datei_a.txt
quellpfad/datei_z.txt
quellpfad/unterpfad_test1/datei_a.txt
quellpfad/unterpfad_test1/datei_z.txt
quellpfad/unterpfad_test2/datei_a.txt
quellpfad/unterpfad_test2/datei_z.txt
quellpfad/unterpfad_test1/unterpfad_von_test1/datei_a.txt
quellpfad/unterpfad_test1/unterpfad_von_test1/datei_z.txt
quellpfad/nochnpfad/weiterer_pfad/datei_a.txt
quellpfad/nochnpfad/weiterer_pfad/datei_z.txt
quellpfad/unterpfad_test1/weiterer_unterpfad_von_test1/datei_a.txt
quellpfad/unterpfad_test1/weiterer_unterpfad_von_test1/datei_z.txt
Ich braeuchte also ein Programm welches nach den Pfadnamen die vor dem Dateinamen stehen sortieren kann.
(Also das zweite Feld von rechts.)

Mit:

Code: Alles auswählen

sort -k Feldnummer -t'/'
kann ich zwar eine Feldnummer angeben aber leider nur von links nach rechts.

Gibt es ein Programm um das zu tun?

Klar, man kann das auch "zu Fuss" in der Shell loesen.
Da es sich aber um sehr viele Dateien handelt (im Moment fast 40000 und zunehmend), haette ich gerne ein schnelles Programm wie sort...

Ich hoffe ich konnte mich einigermassen verstaendlich ausdruecken und waere sehr dankbar fuer Tipps...

Gruss, heinz
Zuletzt geändert von Meillo am 11.10.2019 07:54:53, insgesamt 2-mal geändert.
Grund: Meillo: Titel erweitert

Benutzeravatar
Phineas
Beiträge: 265
Registriert: 20.06.2012 20:26:19

Re: nach dem zweiten Feld von rechts sortieren

Beitrag von Phineas » 09.10.2019 06:23:34

Ein Schuss ins Blaue: Hast Du mal negative Feldnummern getestet?

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

Re: nach dem zweiten Feld von rechts sortieren

Beitrag von Meillo » 09.10.2019 07:31:38

Sonst folgende Technik: Mit sed oder awk das letzte Feld aus der Zeile extrahieren und ihr voranstellen, dass also aus

Code: Alles auswählen

quellpfad/unterpfad_test2/datei_z.txt
das wird

Code: Alles auswählen

unterpfad_test2	quellpfad/unterpfad_test2/datei_z.txt
Dann kannst du naemlich ganz normal nach dem ersten Feld sortieren. Anschliessend einfach nochmal durch sed pipen und das erste Feld wieder wegfiltern:

Code: Alles auswählen

sed 's/^[^	]*	//'
Der dadurch entstehende Performance-Verlust sollte gering sein.
Use ed(1) once in a while!

eggy
Beiträge: 1952
Registriert: 10.05.2008 11:23:50

Re: nach dem zweiten Feld von rechts sortieren

Beitrag von eggy » 09.10.2019 08:41:01

Meillo war schneller .... gleiche Idee, anderes sed ;)

Ich würde per awk die notwendige Sortierstelle einfach vor die Daten schreiben, dann alles sortieren und am Ende wieder abschneiden was nicht gebraucht wird:

Code: Alles auswählen

find ~ |awk -F"/" '{i=NF-1; if (i > 0) {print $i " "$0}}' |sort  |sed "s_.* __" 
Falls Deine Daten Leerzeichen haben, muss man evtl den sed Teil nochmal anpassen, sonst sollte das so funktionieren.

Skalieren tut das ganze auch passabel: die limitierenden Faktoren sind der Dateisystemzugriff von find und der in sort verbaute Sortieralgorithmus. Ohne das nochmal nachgesehn zu haben (coreutils :mrgreen:), denke ich, dass das Quicksort war und damit dann für den Regelfall O(n*log(n). Die Averageannahme stimmt hier zwar nicht ganz, denn Du bekommst als Eingabe ja nen Haufen teilsortierter Listen, ist aber für den Rest der Betrachtung vernachlässigbar. Den, in diesem Fall, linearen awk Einzeiler und das, hier, ebenfalls lineare sed merkst Du mit je "+ O(n)" dann in der Theorie jedenfalls nicht.

In der Realtität sinds dann

Code: Alles auswählen

find mit awk/sort/sed
real    0m3,507s
user    0m2,808s
sys     0m0,548s
gegen

Code: Alles auswählen

nur find
real    0m1,359s
user    0m0,359s
sys     0m0,454s
bei ca 150.000 Dateien. Immer noch schnell genug, dass es sich nicht lohnt, deswegen extra nen eigenes Tool zu schreiben. Falls Du es doch machen willst: "apt-get source coreutils" und dann sort.c und cut.c verheiraten - passend zur Jahreszeit: ein Halloweengruselprojekt :mrgreen:

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

Re: nach dem zweiten Feld von rechts sortieren

Beitrag von Meillo » 09.10.2019 09:14:43

eggy hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 08:41:01
Meillo war schneller .... gleiche Idee, anderes sed ;)
;-)

Code: Alles auswählen

find ~ |awk -F"/" '{i=NF-1; if (i > 0) {print $i " "$0}}' |sort  |sed "s_.* __" 
Danke fuer den awk-Befehl fuer die erste Konvertierung, den ich mir ja gespart habe. ;-)

Beim sed-Befehl fuer die Rueckkonvertierung sollte man aber meinen verwenden, weil ``.*'' greedy ist, d.h. wenn irgendwo im Pfad noch ein Leerzeichen vorkommt, wird bis dorthin alles geloescht! Da muss man aufpassen!

Oder cut(1) verwenden, wie mir gerade einfaellt:

Code: Alles auswählen

cut -f 2-
(fuer Tabs, oder mit ``-d ' ' '' fuer Leerzeichen)
Use ed(1) once in a while!

eggy
Beiträge: 1952
Registriert: 10.05.2008 11:23:50

Re: nach dem zweiten Feld von rechts sortieren

Beitrag von eggy » 09.10.2019 09:21:50

deswegen ja
eggy hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 08:41:01
Falls Deine Daten Leerzeichen haben, muss man evtl den sed Teil nochmal anpassen, sonst sollte das so funktionieren.
sed ist halt nicht so meins, da muss ich immer bezüglich der Syntax nachsehn und sobalds komplizierter wird (aka "immer") nehm ich lieber awk :mrgreen:

Aber die Idee mit dem cut -f 2- ist klasse :THX:

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

Re: nach dem zweiten Feld von rechts sortieren

Beitrag von Meillo » 09.10.2019 11:09:38

eggy hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 09:21:50
nehm ich lieber awk :mrgreen:
Personen, die awk moegen, sind mir sofort sympathisch! ;-)
Use ed(1) once in a while!

Benutzeravatar
heinz
Beiträge: 378
Registriert: 20.12.2007 01:43:49

Re: nach dem zweiten Feld von rechts sortieren

Beitrag von heinz » 09.10.2019 14:56:04

Hallo nochmal,

erstmal vielen Dank fuer Eure Hilfe!
Phineas hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 06:23:34
Ein Schuss ins Blaue: Hast Du mal negative Feldnummern getestet?
Tolle Idee, aber sort mag das leider nicht... (Hatte ich noch nie getestet...)
Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 07:31:38
Mit sed oder awk das letzte Feld aus der Zeile extrahieren und ihr voranstellen
eggy hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 08:41:01
Ich würde per awk die notwendige Sortierstelle einfach vor die Daten schreiben

Code: Alles auswählen

find ~ |awk -F"/" '{i=NF-1; if (i > 0) {print $i " "$0}}' |sort  |sed "s_.* __"
Das Klappt prima und ist auch um vieles schneller als meine Basteleien!
Und,- mal wieder awk...
Habe hier im Forum schon sehr oft loesungen mit awk gesehen, konnte mich aber immer noch nicht aufraffen es mir mal richtig vorzunehmen.
Die Syntax sieht doch eigentlich sehr verstaendlich aus...
Meist bekommt man ja mit den Standardtools alles irgendwie geloest.
Werde mir wohl doch mal ein Buch ueber awk zulegen muessen. Scheint echt DIE "eierlegende Wollmilchsau" fuer Text zu sein.

@Meillo
Du hast mir schonmal einen tollen Buchtipp fuer regexp gegeben.
Hast Du vlt. auch einen Tipp fuer ein awk-Buch fuer mich?

eggy hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 08:41:01
Falls Deine Daten Leerzeichen haben,
Das habe ich mir zum Glueck schon vor Jahren abgewoehnt. Meiner Meinung nach sind Leerzeichen trennzeichen und haben in Dateinamen nix zu suchen.
Aber die Geschmaecker sind ja bekannterweise verschieden...
eggy hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 08:41:01
deswegen extra nen eigenes Tool zu schreiben.
Habe ich mir auch schon ueberlegt, bevorzuge aber lieber Bordmittel...
Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 09:14:43
Oder cut(1) verwenden, wie mir gerade einfaellt:
Das kenne ich wenigstens... :D

Die endgueltige Loesung sieht jetzt so aus.
Funktioniert einwandfrei und ist auch schoen schnell...

Code: Alles auswählen

find quellpfad -type f | awk -F"/" '{i=NF-1; if (i > 0) {print $i " "$0}}' | sort | cut -f2- -d' '
Herzlichen Dank an Euch! [Geloest]

Gruss, heinz

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

Re: nach dem zweiten Feld von rechts sortieren

Beitrag von Meillo » 09.10.2019 20:26:12

heinz hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 14:56:04
Und,- mal wieder awk...
Habe hier im Forum schon sehr oft loesungen mit awk gesehen, konnte mich aber immer noch nicht aufraffen es mir mal richtig vorzunehmen.
Die Syntax sieht doch eigentlich sehr verstaendlich aus...
Awk ist sowas wie die Mischung von C und sed. Wenn du den Arbeitsmodus von sed verstanden hast und die Syntax von C kennst, dann kannst du fast schon awk.

Hier aus meiner Geschichte:

Code: Alles auswählen

2008-03-11

Heute habe ich AWK gelernt.

Das hört sich jetzt lustig an, ist aber  gar  nicht  so  abwegig.
Der Programmablauf ist wie bei SED, die Syntax wie C und das Ein-
satzgebiet wie bei Perl.  Im Gegensatz zu letzterem ist der Spra-
chumfang aber überschaubar.
Awk zu lernen hat also fuer mich nur einen Tag gedauert.
Werde mir wohl doch mal ein Buch ueber awk zulegen muessen. Scheint echt DIE "eierlegende Wollmilchsau" fuer Text zu sein.
Awk ist IMO eine so schoen kleine und verblueffend effektive Sprache. Das beeindruckt mich immer wieder. Mit so wenig laesst sich damit so viel machen. Und im Rahmen des alten Unix schliesst awk die Luecke zwischen C und sh. Awk kann das gut was die beiden schlecht koennen.

Wenn man natuerlich aus der Welt moderner Scriptsprache kommt (Perl, Python, usw.), dann braucht man awk eigentlich nicht mehr. Wenn man aber aus der Shell kommt ist awk ein toller Schritt nach vorne.

(Interessant ist uebrigens, sich den starken Einfluss von awk auf Perl anzuschauen. Perl ist der Wunsch Shell-Pipelines und awk besser (d.h. performanter und einheitlicher) zu machen. Durchsuche mal die Manpage von Perl nach ``awk''!
@Meillo
Du hast mir schonmal einen tollen Buchtipp fuer regexp gegeben.
Hast Du vlt. auch einen Tipp fuer ein awk-Buch fuer mich?
Eigentlich kannst du awk anhand seiner Manpage und ein paar Beispielen erlernen (Kenntnisse von sed und C vorausgesetzt). Wenn du aber ein Buch lesen willst, dann ist es wie immer: Wenn es ein Buch von den Autoren selbst gibt, dann ist das fast immer das beste. Wenn du das Liebhaberwerk ``The AWK Programming Language'' von Aho, Weinberger und Kernighan ergattern kannst, dann ist das den Kauf unbedingt wert. Es ist ein grossartiges Buch! https://en.wikipedia.org/wiki/The_AWK_P ... g_Language

Ich habe noch ein paar andere awk-Buecher bei mir im Regal ... die ich aber bisher nicht gelesen habe, weil es nach diesem Buch eigentlich nichts mehr gibt, was man zu awk noch lesen muesste und man von allem anderen eigentlich nur entaeuscht werden kann. Ich hab dann lieber was anderes von Kernighan gelesen als andere Buecher ueber awk. ;-)

Allerdings ... jetzt, wo ich so darueber nachdenke, sollte ich mir vielleicht doch mal die anderen Buecher vornehmen. Sie muessen ja nicht ungelesen im Regal stehen ... und da ich in den naechsten Tagen mein derzeitiges Buch beenden werde und eh schon am Ueberlegen war, was ich danach lesen soll ... Insofern Danke fuer die Idee! :-)
Use ed(1) once in a while!

Benutzeravatar
heinz
Beiträge: 378
Registriert: 20.12.2007 01:43:49

Re: nach dem zweiten Feld von rechts sortieren [geloest]

Beitrag von heinz » 10.10.2019 12:35:53

Hallo Meillo,

danke fuer Dein Antwort.
Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 20:26:12
Wenn du den Arbeitsmodus von sed verstanden hast und die Syntax von C kennst, dann kannst du fast schon awk.
Naja, ich habe verstanden das sed zeilenorientiert arbeitet. (Verwenden tue ich aber fast nur die Suchen- und Ersetzen-Funktion.)
Und die Syntax von C bekomme ich mittlerweile auch recht gut hin.
Hurra! Ich kann schon fast awk! :D

Aber mal im ernst, es sieht wirklich nicht sehr schwer aus.
Ich glaube der einzige Grund warum ich mich vor awk so lange "gedrueckt" habe ist das man fast alles irgendwie auch ohne hinbekommt.
Oft muss man da allerdings viele Programme aneinanderhaengen, was den Quellcode etwas unuebersichtlich macht und auch fuer die
Ablaufgeschwindigkeit nicht gerade besonders toll ist. (Das kennst Du ja sicher auch...)
Irgendwie liebe ich das aber auch... In der Schell zu Programmieren ist fast wie Basteln mit Knetgummie. Da bekommt man auch alles irgendwie hin...
Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 20:26:12
Awk zu lernen hat also fuer mich nur einen Tag gedauert.
Da bei mir die Computerei nur ein Hobby ist, dauert es immer etwas laenger bis ich ein Programm genuegend oft benutzt habe um es wirklich
zu kennen/koennen.
Sich ein paar Beispielprobleme auszudenken um sie dann mit einem Programm zu loesen (und es dabei zu lernen) ist nicht so meins...
Hier im Forum hat es ja leider auch etwas abgenommen, dass Leute Fragen zum Scripten haben. (mein Gefuehl...)
Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 20:26:12
Wenn man aber aus der Shell kommt ist awk ein toller Schritt nach vorne.
Das spornt mich weiter an awk oefters zu nutzen und besser kennenzulernen. (Die Shell ist genau mein Ding...)
Ueber Perl und Python habe ich auch schon sehr viel gutes gehoert aber das ist mir dann doch etwas zu viel.
Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 20:26:12
Eigentlich kannst du awk anhand seiner Manpage und ein paar Beispielen erlernen...
Wenn du aber ein Buch lesen willst, dann ist es wie immer: Wenn es ein Buch von den Autoren selbst gibt, dann ist das fast immer das beste.
Da ist mein altes Problem wieder, das Englisch.
(Verflixt-, haette ich als Kind gewusst, dass es mal Computer geben wird und die Computerei so viel Spass macht... Ach was solls... :? )
Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 20:26:12
Ich habe noch ein paar andere awk-Buecher bei mir im Regal
Ist da ein Deutsches dabei? :wink:

Wie dem auch sei, ich werde mal etwas in den Buechereien in meiner Gegend rumschauen, vielleicht finde ich ja was brauchbares...
(Trotz meiner Computeraffinitaet, lese ich doch lieber in einem Buch als auf dem Bildschirm. Liegt wohl am Alter... :wink: )
Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 20:26:12
...eh schon am Ueberlegen war, was ich danach lesen soll ... Insofern Danke fuer die Idee!
*lach*, Gerne... (Wie bei den Pfadfindern... Jeden Tag eine gute Tat. :lol: )

Herzlichen Dank fuer Deine ausfuehrliche Antwort!

Freundliche Gruesse, heinz

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

Re: nach dem zweiten Feld von rechts sortieren [geloest]

Beitrag von Meillo » 10.10.2019 14:27:21

heinz hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 12:35:53
Sich ein paar Beispielprobleme auszudenken um sie dann mit einem Programm zu loesen (und es dabei zu lernen) ist nicht so meins...
Meines auch nicht. Normalerweise lese ich zuerst ein Buch und brauche dann ein reales Projekt (nicht bloss so Sandkastenbeispiele).
Hier im Forum hat es ja leider auch etwas abgenommen, dass Leute Fragen zum Scripten haben. (mein Gefuehl...)
Keine Ahnung, ob das generell so ist, Es gibt schon immer wieder mal Phasen mit mehr oder weniger solchen Themen. Ich mag sie aber sehr. Dort programmiere ich am meisten awk. Zumeist sind es ja kleine, ueberschaubare Probleme, die man (mit etwas Erfahrung) schnell mal auf zwei, drei verschiedene Arten umsetzen kann, und dennoch sind es reale Probleme und nicht so theoretische Konstrukte.

Versuche dich also an so Problemen und poste dann deine Loesungen mit dem Wunsch fuer Hinweise. Oder nimm awk-Loesungen, die andere geliefert haben und veraendere oder erweitere sie.

Du kannst gerne auch hier im Forum einen awk-Lern-Thread aufmachen. Ich koennte mir denken, dass es manche User geben koennte, die da gerne helfen. ;-)
Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 20:26:12
Wenn man aber aus der Shell kommt ist awk ein toller Schritt nach vorne.
Das spornt mich weiter an awk oefters zu nutzen und besser kennenzulernen. (Die Shell ist genau mein Ding...)
Das Tolle an der Shell ist, dass man dort sowas wie awk einfach fliessend einbauen kann. Es gibt dort kein Grenze zwischen Programmaufrufen und Programmiersprachen. Ob tr(1) oder sed(1) oder awk(1) ist eigentlich kein Unterschied, wenn auch ersteres ein fertiges Programm fuer einen bestimmten Zweck ist, zweiteres flexibel (und wenn auch nicht praktikabel so zumindest theoretisch turing-vollstaendig ist), und drittes eine komplette Programmiersprache ist, die man aber auch in einer so einfachen Form wie sed verwenden kann. Und das alles eingebettet in die Shell, die wiederum in sich selbst einen fliessenden Uebergang von Programmaufrufmoeglichkeit und voller Programmiersprache ist. (Wenn man sich fuer so Ideen interessiert, dann sollte man sich mal Tcl anschauen, das ist auch syntaktisch noch fliessend.)

Btw: Dieser fliessende Uebergang ist IMO eine der groessten Staerken von Unix und das was der heutigen Computerbenutzung am meisten fehlt. Ich finde, dass diese stark gefuehlte Grenze zwischen dummen Anwendern und maechtigen Informatikern kuenstlich, unnoetig und schlecht ist. Sie ist die Folge von Softwaresystemen die diese virtuelle Grenze den Anwendern ueber Jahrzehnte eingetrichtert haben. Excel ist aus meiner Sicht der einzige Lichtblick in dieser Hinsicht. Dort hat man einen fliessenden Uebergang von der Trivialbenutzung zur vollen Programmierung. In meiner Vorstellung sollte das der Normalfall aller Softwaresysteme sein.

Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 20:26:12
Eigentlich kannst du awk anhand seiner Manpage und ein paar Beispielen erlernen...
Wenn du aber ein Buch lesen willst, dann ist es wie immer: Wenn es ein Buch von den Autoren selbst gibt, dann ist das fast immer das beste.
Da ist mein altes Problem wieder, das Englisch.
(Verflixt-, haette ich als Kind gewusst, dass es mal Computer geben wird und die Computerei so viel Spass macht... Ach was solls... :? )
Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 20:26:12
Ich habe noch ein paar andere awk-Buecher bei mir im Regal
Ist da ein Deutsches dabei? :wink:
Das awk-Buch von Kernighan ist AFAIK leider nie uebersetzt worden.

Aber das kleine Buechlein ``SED & AWK -- gepackt'' von Stephan Thesing (2004, mitp-Verlag) finde ich ebenfalls sehr gut. In seiner Art ist es ganz anders aufgebaut, mehr eine Referenz, aber qualitativ finde ich es super. Anhand von ihm habe ich damals sed verstanden, d.h. durch dieses Buch habe ich mich ueber reine s-Kommandos erhoben. Den awk-Teil fand ich nicht ganz so gut wie den sed-Teil, aber er lohnt sich dennoch. (Schoen finde ich auch, dass stets die Unterschiede zwischen den verschiedenen Implementierungen beruecksichtigt werden.) Soviel ich weiss gibt es das Buch aber nur noch auf dem Gebrauchtmarkt.

Bei aktuellen Buechern kenne ich mich schlecht aus. Ich habe fast nur altes Zeug. Aber wahrscheinlich kannst du ebenso gut ein beliebiges awk-Buch von O'Reilly nehmen (solange es keine Kurzreferenz ist). Nur bei Buechern zur Shellprogrammierung, die nur ein awk-Kapitel haben, glaube ich eher nicht, dass die wirklich hilfreich sind. Das ist aber nur eine grobe Einschaetzung. Auch da kann es Schaetze geben.
(Trotz meiner Computeraffinitaet, lese ich doch lieber in einem Buch als auf dem Bildschirm. Liegt wohl am Alter... :wink: )
Falls das am Alter liegen sollte, dann bin ich auch in deinem Alter. ;-)

Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2019 20:26:12
...eh schon am Ueberlegen war, was ich danach lesen soll ... Insofern Danke fuer die Idee!
*lach*, Gerne... (Wie bei den Pfadfindern... Jeden Tag eine gute Tat. :lol: )
Ich habe jetzt mit ``Programmieren in awk'' von Jürgen Peters (1993, Oldenbourg Verlag) begonnen. Bis zum eigentlichen Inhalt bin ich aber noch nicht vorgedrungen.
Use ed(1) once in a while!

eggy
Beiträge: 1952
Registriert: 10.05.2008 11:23:50

Re: nach dem zweiten Feld von rechts sortieren [geloest]

Beitrag von eggy » 10.10.2019 17:42:07

@heinz: Ich hab awk (ausnahmsweise mal) ganz ohne Buch gelernt. Die Sprache ist wirklich einfach und man muss ja auch nicht gleich von Anfang an alle Möglichkeiten ausnutzen.
https://wiki.debianforum.de/AWK
Ich hab mich mal an ner Erklärung versucht, ist nicht fertig, aber vielleicht magst Du trotzdem mal reinlesen und sagen, ob das verständlich genug war? Ich schreib gerne noch mehr dazu, mir fällt nur so auf die schnelle nichts weiter ein (abgesehn von dem unten erwähntem).

@Meillo: vielleicht magst Du ergänzen/berichtigen?
Und natürlich auch jeder andere, ist schließlich ein Wiki. Was aus meiner Sicht noch fehlt: Beispiele für if, for, next und gsub ...
Denke, jeder benutzt ein etwas anderes Subset an Lieblingsfunktionen, ich hau fast immer mit gsub und next drauf. Bin auf andere Vorschläge gespannt.

Edit: Wobei, so ganz ohne Buch stimmt nicht, das gnu awk manual ist recht ausführlich, das ist ja eigentlich nen Buch. Wobei ich das auch nur zum nachlesen nehm, im Ganzen hab ichs noch nicht gelesen (sollt ich vielleicht mal tun :mrgreen: )

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

Re: nach dem zweiten Feld von rechts sortieren [geloest]

Beitrag von Meillo » 11.10.2019 07:48:16

Meillo hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 14:27:21
Ich habe jetzt mit ``Programmieren in awk'' von Jürgen Peters (1993, Oldenbourg Verlag) begonnen. Bis zum eigentlichen Inhalt bin ich aber noch nicht vorgedrungen.
Inzwischen habe ich den ersten inhaltlichen Abschnitt (1.1) gelesen ... und bin leider schwer entaeuscht. Dort werden 12 Einfuehrungsbeispiele aufgefuehrt, alles Einzeiler, die eine Vorstellung von awk geben sollen. Hier mein Urteil:

- 2 Beispiele gut und korrekt
- 6 Beispiele umstaendlich, ungenau oder beschraenkt
- 4 Beispiele falsch

Das ist vernichtend!


Die Fehler sind:

- /^ / statt /^ */, wodurch nur das erste Leerzeichen ersetzt wird statt alle, wie im Text beschrieben
- -F, wurde vergessen, wodurch der falsche Feldtrenner verwendet wird
- Der Rueckgabewert von sprintf() wird ignoriert, wodurch die Funktion ein NOP ist
- = statt ==, wodurch die Bedingung immer true ist

Hast das Buch je ein Review gesehen?


Und zur Umstaendlichkeit und Ungenauigkeit:

Um ``den Eintrag von Klaus-Dieter'' zu entfernen, wird folgender Befehl vorgeschlagen:

Code: Alles auswählen

awk '/Klaus-Dieter/{next} {print}'
Ein awk-Programmierer wuerde es aber stets so loesen:

Code: Alles auswählen

awk '!/Klaus-Dieter/'
Tatsaechlich waere aber folgender Befehl fachlich korrekt:

Code: Alles auswählen

awk -F, '$2 != "Klaus-Dieter"'

Bei solchen Buechern denke ich immer wieder, dass ich eigentlich eine Detailanalyse des ganzen Buches machen sollte, jede Stelle genau analysieren und erklaeren warum das so schlecht ist und wie es besser waere. Wenn ich mal ein Buch schreiben sollte, dann wird es am ehesten in der Art sein.

Irgendwie ist mir das Lesevergnuegen vergangen ... Warum nur hatte ich das schon vorher geahnt? Weiterzulesen macht eigentlich nur dann Sinn, wenn ich anfange, es detailliert zu zerlegen. Nur dann entsteht eine neue Motivation fuer mich, mich damit weiter auseinanderzusetzen ...


Also, ich nehme meine Aussage von oben zurueck: Man sollte nicht einfach irgendein awk-Buch nehmen.
Use ed(1) once in a while!

Benutzeravatar
heinz
Beiträge: 378
Registriert: 20.12.2007 01:43:49

Re: nach dem zweiten Feld von rechts sortieren [geloest] (plus: awk lernen)

Beitrag von heinz » 11.10.2019 15:56:54

Meillo hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 14:27:21
...Es gibt schon immer wieder mal Phasen mit mehr oder weniger solchen Themen. Ich mag sie aber sehr.
Jup, ich auch.
Ich habe dort auch in meiner Script-Anfangszeit viel gelernt und bin immer wieder auf neue, mir unbekannte Befehle/Programme gestossen.
Meillo hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 14:27:21
Versuche dich also an so Problemen und poste dann deine Loesungen mit dem Wunsch fuer Hinweise.
Oder nimm awk-Loesungen, die andere geliefert haben und veraendere oder erweitere sie.
Werde ich versuchen...
Oft ist es allerdings so, dass die Fragen schon mehrfach beantwortet sind (auch oft mit awk) bevor ich ueberhaupt mitbekomme das es
eine Frage gibt... (bin nicht so oft Online...)
Meillo hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 14:27:21
Du kannst gerne auch hier im Forum einen awk-Lern-Thread aufmachen.
Das hat eggy wohl schon liebenswuerdigerweise fuer mich erledigt... :D
https://wiki.debianforum.de/AWK
Meillo hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 14:27:21
Und das alles eingebettet in die Shell, die wiederum in sich selbst einen fliessenden Uebergang von Programmaufrufmoeglichkeit und voller Programmiersprache ist.
Das liebe ich so an der Shell.
Es laesst sich so gut wie alles in der Shell loesen, sogar Bild- und Soundbearbeitung... Echt Klasse!
(Ertappe mich auch manchmal dabei ein Projekt erst in der Shell zu testen, bevor ich es dann endgueltig in C schreibe...)
Meillo hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 14:27:21
Wenn man sich fuer so Ideen interessiert, dann sollte man sich mal Tcl anschauen...
Habe ich mir vor vielen Jahren mal angeschaut weil man damit auch grafische Ausgaben erstellen kann.
Ich empfand die Syntax aber damals eher als aegyptische Hieroglyphen.
Vielleicht sollte ich da nochmal einen Blick darauf werfen...
Aber ein Schritt nach dem anderen. Jetzt kommt erst mal awk.
Meillo hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 14:27:21
...Dieser fliessende Uebergang ist IMO eine der groessten Staerken von Unix und das was der heutigen Computerbenutzung am meisten fehlt...
Excel ist aus meiner Sicht der einzige Lichtblick in dieser Hinsicht.
Oh, ich haette Excel niemals irgendwie mit Programmieren in verbindung gebracht.
(Habe es aber auch nie wirklich genutzt...)
Meillo hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 14:27:21
Das awk-Buch von Kernighan ist AFAIK leider nie uebersetzt worden.
Was sehr schade ist...
Meillo hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 14:27:21
Aber das kleine Buechlein ``SED & AWK -- gepackt'' von Stephan Thesing (2004, mitp-Verlag) finde ich ebenfalls sehr gut.
Klingt interessant, werde mal danach suchen.
Meillo hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 14:27:21
Soviel ich weiss gibt es das Buch aber nur noch auf dem Gebrauchtmarkt.
Habe schon das regexp-Buch von Friedl (O'Reilly) in einem Antiquariat hier um die Ecke gefunden.
So schlecht stehen die Chancen also nicht unbedingt...
Meillo hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 14:27:21
Bei aktuellen Buechern kenne ich mich schlecht aus. Ich habe fast nur altes Zeug.
Apropos altes Zeug...
Habe daraufhin mal mein altes Buch "LINUX intern" von DATA BECKER (1999) rausgekramt.
Immerhin 5 Seiten awk (von fast 1400). Da sind auch einige Beispiele drin...
Insofern Danke, fuer den Schubs in diese Richtung...
Meillo hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 14:27:21
Ich habe jetzt mit ``Programmieren in awk'' von Jürgen Peters (1993, Oldenbourg Verlag) begonnen.
Hier mein Urteil: Das ist vernichtend!
Also, ich nehme meine Aussage von oben zurueck: Man sollte nicht einfach irgendein awk-Buch nehmen.
Oha, das klingt nicht gerade besonders erfreulich.
Wie soll jemand wie ich, der es lernen will, da die Spreu vom Weizen trennen?
Die Fehler findet man ja nur wenn man sich damit schon auskennt.
Der O'Reilly Verlag scheint in dieser Beziehung aber einen guten Ruf zu haben. (War ja auch eine Empfehlung von Dir...)


eggy hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 17:42:07
Die Sprache ist wirklich einfach
Noch jemand der mich anspornt. Danke! :D
eggy hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 17:42:07
und man muss ja auch nicht gleich von Anfang an alle Möglichkeiten ausnutzen.
Da hast Du natuerlich Recht. Von Anfang an alles zu koennen, geht sowieso kaum...
Das ist auch der Grund fuer meine Vorliebe fuer Buecher.
Abends im Bett oder auf einer Zugfahrt etwas "schmoekern" hat halt was... Und irgendwas bleibt eigentlich immer haengen.
eggy hat geschrieben: ↑ zum Beitrag ↑
10.10.2019 17:42:07
Ich hab mich mal an ner Erklärung versucht, ist nicht fertig, aber vielleicht magst Du trotzdem mal reinlesen und sagen, ob das verständlich genug war?
Das sieht doch schon sehr vielversprechend aus.
Bitte nicht persoenlich oder als Kritik aufnehmen aber mir fehlt bei den Beispielen ein wenig, was die Eingabedaten sind und
wie sie nach dem awk-Befehl aussehen.
Das liegt aber vlt. auch nur an meiner Art zu lernen...

Vielleicht schaffe ich es ja, wenn ich awk etwas kann, mich an diesem Wiki zu beteiligen.
(Obwohl ich auch noch keine Ahnung davon habe, wie das mit dem Wiki hier ueberhaupt funktioniert...)


Was mir bis jetzt bei meiner Recherche aufgefallen ist, es gibt nicht nur DAS awk, sondern auch noch gawk, mawk, nawk, (noch weitere awk´s?).
Bei mir scheint mawk vorinstalliert zu sein (awk und nawk als Link auf mawk) und gawk gibt es als extra Paket...
Sind da groessere Unterschiede?


Euch nochmals vielen Dank fuer Eure Antworten und Eure Muehe!

Schoenes Wochenende.
Gruss, heinz

eggy
Beiträge: 1952
Registriert: 10.05.2008 11:23:50

Re: nach dem zweiten Feld von rechts sortieren [geloest] (plus: awk lernen)

Beitrag von eggy » 11.10.2019 16:47:00

heinz hat geschrieben: ↑ zum Beitrag ↑
11.10.2019 15:56:54
Bitte nicht persoenlich oder als Kritik aufnehmen
Keine Sorge, ich kann mit (konstruktiver) Kritik umgehn (behaupte ich zumindest einfach mal so :mrgreen:).
heinz hat geschrieben: ↑ zum Beitrag ↑
11.10.2019 15:56:54
mir fehlt bei den Beispielen ein wenig, was die Eingabedaten sind und wie sie nach dem awk-Befehl aussehen.
Ich wollts extra knapp halten, die konkreten Beispiele weiter unten beziehen sich immer auf Dateien, die man auf dem eigenen System auch haben sollte (weil /etc/passwd, die sieht überall fast gleich aus; oder Beispieldateien, die automatisch mit gawk installiert werden) und damit leicht selbst ausprobieren kann. Ok, sollt man wohl besser dazu schreiben, mach gleich mal. Aber ob das mit ausführlichen "vorher/hinterher" Beispielen den Artikel lesbarer macht, keine Ahnung.
heinz hat geschrieben: ↑ zum Beitrag ↑
11.10.2019 15:56:54
Vielleicht schaffe ich es ja, wenn ich awk etwas kann, mich an diesem Wiki zu beteiligen.
(Obwohl ich auch noch keine Ahnung davon habe, wie das mit dem Wiki hier ueberhaupt funktioniert...)
Würde mich freuen. Dein Wikiaccount sollte mit dem Daten aus dem Forum übereinstimmen, falls das Einloggen im Wiki nicht klappt, PM an feltel, der fixt das sehr fix. Dann einfach einloggen und munter drauf los schreiben, die Formatierung kannst Du aus anderen Artikeln klauen. Mehr als "zwei Leerzeichen, dann wirds als Code dargestellt" braucht man anfangs kaum, der Rest ergibt sich.
Es gab hier auch irgendwo nen "ich hab nen Wikiartikel geschrieben, schaut mal bitte drüber"-Thread. Denke, da findet sich dann auch noch mal jemand, der den Artikel am Ende für uns hübsch machen kann.
heinz hat geschrieben: ↑ zum Beitrag ↑
11.10.2019 15:56:54
Was mir bis jetzt bei meiner Recherche aufgefallen ist, es gibt nicht nur DAS awk, sondern auch noch gawk, mawk, nawk, (noch weitere awk´s?).
Bei mir scheint mawk vorinstalliert zu sein (awk und nawk als Link auf mawk) und gawk gibt es als extra Paket...
Sind da groessere Unterschiede?
Ja, gibt viele andere und ja, Unterschiede gibts bei denen auch noch wie Sand am Meer. Mir fällt zwar kein konkretes Beispiel außer "mal sind Arrays sortiert, mal nicht" ein, aber ich bin da auch schon kräftig auf die Nase gefallen. Glaube, auch die Art der RegEx war manchmal subtil anders, kann mich da aber irren.
https://www.gnu.org/software/gawk/manua ... Extensions
https://en.wikipedia.org/wiki/Awk_langu ... mentations

Antworten