Awk ist ein leistungsfähiges Tool, das einige Aufgaben ausführen kann, die auch von anderen gängigen Dienstprogrammen erledigt werden könnten, einschließlich Sortieren. Awk ist ein allgegenwärtiger Unix-Befehl zum Scannen und Verarbeiten von Texten mit vorhersehbaren Mustern. Da sie jedoch über funktionale Fähigkeiten verfügt, kann man sie durchaus auch als Programmiersprache bezeichnen. Verwirrenderweise gibt es mehr als ein Awk. (Oder, wenn Sie denken, es gibt nur eines, dann sind die anderen Klone.) Es gibt awk (das Originalprogramm von Aho, Weinberger und Kernighan), und dann gibt es nawk, mawk und die GNU-Version von gawk. Bei der GNU-Version von awk handelt es sich um eine äußerst portable, kostenlose Softwareversion des Dienstprogramms mit mehreren einzigartigen Funktionen. Dieser Artikel handelt daher von GNU awk. Obwohl der offizielle Name gawk lautet, wird es auf GNU+Linux-Systemen als Alias awk verwendet und als Standardversion des Befehls verwendet. Auf anderen Systemen, die nicht mit GNU awk geliefert werden, müssen Sie es zuerst installieren und es gawk statt awk nennen. In diesem Artikel werden die Begriffe „awk“ und „gawk“ synonym verwendet. awk ist sowohl eine Befehlssprache als auch eine Programmiersprache, was es zu einem leistungsstarken Werkzeug für Aufgaben macht, die sonst sort, cut, uniq und anderen gängigen Dienstprogrammen vorbehalten sind. Glücklicherweise gibt es bei Open Source jede Menge Raum für Redundanz. Wenn Sie also vor der Frage stehen, ob Sie awk verwenden sollen, lautet die Antwort wahrscheinlich ein klares „egal“. Das Schöne an der Flexibilität von awk ist, dass Sie, wenn Sie sich entschieden haben, awk zum Ausführen einer Aufgabe zu verwenden, awk weiterhin verwenden können, unabhängig davon, was als Nächstes passiert. Hierzu gehört die ständige Notwendigkeit, Ihre Daten zu sortieren und nicht nach der Reihenfolge, in der sie Ihnen übermittelt werden. Beispieldatensatz Bevor Sie die Sortiermethoden von awk erkunden, generieren Sie einen Beispieldatensatz, mit dem Sie arbeiten können. Halten Sie es einfach, damit Sie nicht in Randfällen und unerwarteten Komplexitäten stecken bleiben. Dies ist der in diesem Artikel verwendete Beispielsatz: Aptenodytes;forsteri;Miller,JF;1778;Kaiser Pygoscelis;Papua;Wagler;1832;Eselspinguin Eudyptula, minor, Bonaparte, 1867, Little Blue Spheniscus;demersus;Brisson;1760;Afrikaner Megadyptes;Antipoden;Milne-Edwards;1880;Gelbäugiger Eudyptes;chrysocome;Viellot;1816;Südlicher Felsenpinguin Torvaldis;linux;Ewing,L;1996;Tux Dies ist ein kleiner Datensatz, der jedoch eine Vielzahl von Datentypen bereitstellt:
Abhängig von Ihrem Bildungshintergrund stellen Sie sich dies möglicherweise als ein zweidimensionales Array oder eine Tabelle oder einfach als eine zeilengetrennte Datensammlung vor. Wie Sie es sehen, ist Ihr Problem; awk erkennt nur Text. Es liegt an Ihnen, awk mitzuteilen, wie es analysiert werden soll. Ich möchte nur sortieren Wenn Sie einen Textdatensatz nur nach einem bestimmten definierbaren Feld (wie einer „Zelle“ in einer Tabelle) sortieren möchten, können Sie den Sortierbefehl verwenden. Felder und Datensätze Unabhängig vom Format der Eingabe müssen Sie darin Muster finden, damit Sie sich auf die Teile der Daten konzentrieren können, die für Sie wichtig sind. In diesem Beispiel werden die Daten durch zwei Faktoren abgegrenzt: Zeilen und Felder. Jede Zeile stellt einen neuen Datensatz dar, genau wie Sie ihn in einer Kalkulationstabelle oder einem Datenbank-Dump sehen würden. Innerhalb jeder Zeile gibt es unterschiedliche Felder (stellen Sie sich diese wie Zellen in einer Tabelle vor), die durch Semikolon (;) getrennt sind. Awk verarbeitet jeweils nur einen Datensatz. Wenn Sie daher die an Awk gesendeten Anweisungen erstellen, können Sie sich auf nur eine Datensatzzeile konzentrieren. Schreiben Sie auf, was Sie mit einer Datenzeile tun möchten, testen Sie es dann in der nächsten Zeile (entweder im Kopf oder mit awk) und führen Sie anschließend einige weitere Tests durch. Schließlich müssen Sie einige Annahmen über die Daten treffen, die Ihr awk-Skript verarbeiten wird, damit es Ihnen die Daten in der gewünschten Struktur bereitstellen kann. In diesem Beispiel ist leicht zu erkennen, dass die einzelnen Felder durch ein Semikolon getrennt sind. Nehmen wir der Einfachheit halber an, dass Sie die Liste nach dem ersten Feld in jeder Zeile sortieren möchten. Bevor Sie mit der Sortierung beginnen können, müssen Sie awk so einrichten, dass es sich nur auf das erste Feld jeder Zeile konzentriert. Das ist der erste Schritt. Die Syntax des awk-Befehls im Terminal lautet awk, gefolgt von relevanten Optionen und schließlich der zu verarbeitenden Datendatei. $ awk --field-separator=";" '{print $1;}' Pinguine.Liste Aptenodyten Pygoscelis Eudyptula Spheniscus Megadypten Eudyptes Torvaldis Da der Feldtrenner ein Zeichen ist, das für die Bash-Shell eine besondere Bedeutung hat, müssen Sie das Semikolon in Anführungszeichen setzen oder ihm einen Backslash voranstellen. Mit diesem Diplom beweisen Sie lediglich, dass Sie sich auf ein bestimmtes Fachgebiet spezialisieren können. Sie können denselben Befehl mit einer anderen Feldnummer ausprobieren, um den Inhalt einer anderen Datenspalte anzuzeigen: $ awk --field-separator=";" '{print $3;}' penguins.list Miller, J.F. Wagler Bonaparte Brisson Milne-Edwards Viellot Ewing, L Wir haben noch keine Sortierung vorgenommen, aber dies ist eine gute Grundlage. Skripterstellung awk ist mehr als nur ein Befehl, es ist eine Programmiersprache mit Indizierung, Arrays und Funktionen. Dies ist wichtig, da Sie so eine Liste mit zu sortierenden Feldern erstellen, diese im Speicher ablegen, die Verarbeitung durchführen und anschließend die resultierenden Daten ausdrucken können. Bei einer komplexen Reihe von Vorgängen wie dieser ist es einfacher, sie in einer Textdatei durchzuführen. Erstellen Sie daher eine neue Datei mit dem Namen sort.awk und geben Sie den folgenden Text ein: #!/bin/gawk -f BEGINNEN { FS=";"; } Dadurch wird die Datei in ein Awk-Skript integriert, das die ausgeführten Zeilen enthält. Die BEGIN-Anweisung ist eine spezielle Setup-Funktion, die von awk für Aufgaben bereitgestellt wird, die nur einmal ausgeführt werden müssen. Definiert die integrierte Variable FS, die für Feldtrennzeichen steht und denselben Wert hat, den Sie mit --field-separator im awk-Befehl festlegen. Dies muss nur einmal ausgeführt werden und ist daher in der BEGIN-Anweisung enthalten. Arrays in awk Sie wissen bereits, wie Sie den Wert eines bestimmten Felds mithilfe des Symbols „$“ und der Feldnummer erfassen, in diesem Fall möchten Sie ihn jedoch in einem Array speichern, anstatt ihn auf dem Terminal auszugeben. Dies wird mit Awk-Arrays durchgeführt. Das Wichtige an einem Awk-Array ist, dass es Schlüssel und Werte enthält. Stellen Sie sich den Inhalt dieses Artikels vor. Er würde folgendermaßen aussehen: Autor: „Seth“, Titel: „So sortieren Sie mit awk“, Länge: 1200. Elemente wie Autor, Titel und Länge sind Schlüssel und der folgende Inhalt ist der Wert. Der Vorteil hierbei im Kontext der Sortierung besteht darin, dass Sie jedes beliebige Feld als Schlüssel und jeden beliebigen Datensatz als Wert zuweisen und dann die integrierte awk-Funktion asorti() (Sortieren nach Index) verwenden können, um nach den Schlüsseln zu sortieren. Nehmen wir nun kurz an, dass Sie nur nach dem zweiten Feld sortieren möchten. Eine awk-Anweisung, die nicht von den speziellen Schlüsselwörtern BEGIN oder END umschlossen ist, ist eine Schleife, die für jeden Datensatz ausgeführt wird. Dies ist der Teil des Skripts, der die Daten nach Mustern durchsucht und entsprechend verarbeitet. Jedes Mal, wenn awk seine Aufmerksamkeit einem Datensatz zuwendet, werden die Anweisungen zwischen {} ausgeführt (sofern ihnen nicht BEGIN oder END vorangestellt ist). Um Schlüssel und Werte zu einem Array hinzuzufügen, erstellen Sie eine Variable, die das Array enthält (in diesem Beispielskript werde ich sie ARRAY nennen, was nicht sehr originell, aber klar ist), und weisen Sie ihr dann den Schlüssel in eckigen Klammern und den Wert mit einem Gleichheitszeichen (=) zu. { # jedes Feld in ein Array kopieren ARRAY[$2] = $R; } In dieser Anweisung wird der Inhalt des zweiten Felds ($2) als Schlüssel und der aktuelle Datensatz ($R) als Wert verwendet. Funktion asorti() Zusätzlich zu Arrays verfügt awk über einige grundlegende Funktionen, die Sie als schnelle und einfache Lösung für gängige Aufgaben verwenden können. Eine der in GNU awk eingeführten Funktionen, asorti(), bietet die Möglichkeit, ein Array nach Schlüssel (Index) oder Wert zu sortieren. Das Sortieren des Arrays ist erst nach dem Auffüllen möglich, d. h. dieser Vorgang kann nicht bei jedem neuen Datensatz ausgelöst werden, sondern nur ganz am Ende des Skripts. Zu diesem Zweck stellt awk das spezielle Schlüsselwort END bereit. Im Gegensatz zu BEGIN wird die END-Anweisung nur einmal ausgelöst, nachdem alle Datensätze gescannt wurden. Fügen Sie Ihrem Skript Folgendes hinzu: ENDE { asorti(ARRAY,SARRAY); # Länge ermitteln j = Länge(SARRAY); für (i = 1; i <= j; i++) { druckenf("%s %s\n", SARRAY[i],ARRAY[SARRAY[i]]) } } Die Funktion asorti() nimmt den Inhalt von ARRAY, sortiert ihn nach Index und fügt die Ergebnisse in ein neues Array namens SARRAY ein (ein beliebiger Name, den ich für diesen Artikel erfunden habe und der für „sorted ARRAY“ steht). Als nächstes wird der Variable j (ein weiterer beliebiger Name) das Ergebnis der Funktion length() zugewiesen, die die Anzahl der Elemente in SARRAY zählt. Schließlich wird eine For-Schleife verwendet, um mit der Funktion printf() durch jedes Element in SARRAY zu iterieren, jeden Schlüssel auszudrucken und dann den entsprechenden Wert für diesen Schlüssel in ARRAY auszudrucken. Ausführen des Skripts Um Ihr awk-Skript auszuführen, machen Sie es ausführbar: Führen Sie es dann mit den Beispieldaten von Penguin.list aus: $ ./sorter.awk pinguine.liste Antipoden Megadyptes;Antipoden;Milne-Edwards;1880;Gelbäugiger chrysocome Eudyptes;chrysocome;Viellot;1816;Südlicher Felsenpinguin demersus Spheniscus;demersus;Brisson;1760;Afrikaner forsteri Aptenodytes;forsteri;Miller,JF;1778;Kaiser linux Torvaldis;linux;Ewing,L;1996;Tux Moll Eudyptula;Moll;Bonaparte;1867;Little Blue Papua Pygoscelis; Papua; Wagler; 1832; Gentoo Wie Sie sehen, werden die Daten nach dem zweiten Feld sortiert. Dies ist etwas einschränkend. Es wäre schön, die Flexibilität zu haben, zur Laufzeit auszuwählen, welches Feld als Sortierschlüssel verwendet werden soll, sodass ich dieses Skript auf jeden Datensatz anwenden und aussagekräftige Ergebnisse erhalten könnte. Befehlsoptionen hinzufügen Sie können einem Awk-Skript Befehlsvariablen hinzufügen, indem Sie im Skript den Literalwert var verwenden. Ändern Sie das Skript so, dass die Iterationsklausel beim Erstellen des Arrays var verwendet: { # jedes Feld in ein Array kopieren ARRAY[$var] = $R; } Versuchen Sie, das Skript auszuführen, sodass es nach dem dritten Feld sortiert wird. Verwenden Sie dazu bei der Ausführung des Skripts die Option -v var: $ ./sorter.awk -v var=3 Pinguine.Liste Bonaparte Eudyptula;Minor;Bonaparte;1867;Kleiner Blauer Brisson Spheniscus;demersus;Brisson;1760;Afrikaner Ewing, L Torvaldis;linux;Ewing, L;1996;Tux Miller, JF Aptenodytes;forsteri;Miller, JF;1778;Kaiser Milne-Edwards Megadyptes;Antipoden;Milne-Edwards;1880;Gelbäugiger Viellot Eudyptes;chrysocome;Viellot;1816;Südlicher Felsenpinguin Wagler Pygoscelis;Papua;Wagler;1832;Eselspinguin Revision Dieser Artikel zeigt, wie Daten in reinem GNU awk sortiert werden. Sie können das Skript verbessern, sodass es für Sie nützlich ist. Nehmen Sie sich etwas Zeit, um die awk-Funktionen auf der Manpage von gawk zu studieren, und passen Sie das Skript an, um eine bessere Ausgabe zu erhalten. Hier ist das vollständige Skript bisher: #!/usr/bin/awk -f # GPLv3 erscheint hier # Verwendung: ./sorter.awk -v var=NUM DATEI BEGINNEN { FS=";"; } { # jedes Feld in ein Array kopieren ARRAY[$var] = $R; } ENDE { asorti(ARRAY,SARRAY); # Länge ermitteln j = Länge(SARRAY); für (i = 1; i <= j; i++) { druckenf("%s %s\n", SARRAY[i],ARRAY[SARRAY[i]]) } } Zusammenfassen Oben ist die Awk-Befehlszeile oder das Skript, das ich Ihnen vorgestellt habe, um Ihnen beim Sortieren von Textdateien zu helfen. Ich hoffe, es wird Ihnen helfen. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und ich werde Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken! Das könnte Sie auch interessieren:
|
<<: Beispiele für 4 Methoden zum Einfügen großer Datenmengen in MySQL
>>: Das WeChat-Applet implementiert eine einfache handschriftliche Signaturkomponente
Technische Struktur Das Projekt ist in zwei Teile...
Lastenausgleich ist ein häufig verwendetes Mittel...
Kürzlich hat das WeChat Mini-Programm Anpassungen...
<br />Basierend auf dem ursprünglichen, in B...
Haftungsausschluss: Da das Projekt die Verwendung...
1: schreibgeschützt dient zum Sperren dieses Steue...
Inhaltsverzeichnis Prämisse TypeScript vs. JavaSc...
•Es gibt viele Selektoren in CSS. Was passiert, w...
Pure js implementiert eine mit einem Klick bearbe...
In vielen Projekten muss eine Countdown-Funktion ...
<br />In der HTML-Sprache können Sie der Tab...
Der zu erzielende Effekt In vielen Fällen überwac...
Inhaltsverzeichnis Routing-Plugins modular nutzen...
Es gibt einige Probleme mit der komprimierten Ver...
Deaktivieren Sie SeLinux setenforce 0 Dauerhaft g...