Wie man den Befehl 'next' mit awk in Linux verwendet - Teil 6
In diesem sechsten Teil der Awk-Serie tauchen wir in den nächsten Befehl ein und sehen, wie er zur Optimierung Ihrer Skriptausführungen verwendet werden kann, da dieser Befehl besonders nützlich ist, um unnötige Schritte bei der Verarbeitung Ihrer Daten zu überspringen.
Was ist der nächste Befehl?
Der nächste Befehl in awk weist es an, die verbleibenden Muster und Aktionen für die aktuelle Zeile zu überspringen und mit der nächsten Eingabezeile fortzufahren. Dies kann dazu beitragen, das Ausführen redundanter oder unnötiger Schritte zu vermeiden und Ihre Skripts effizienter zu machen.
Beispiel 1: Kennzeichnen von Artikeln basierend auf der Menge
Beginnen wir mit einem praktischen Beispiel, indem wir eine Datei mit dem Namen food_list.txt mit dem folgenden Inhalt betrachten.
Food List Items
No Item_Name Price Quantity
1 Mangoes $3.45 5
2 Apples $2.45 25
3 Pineapples $4.45 55
4 Tomatoes $3.45 25
5 Onions $1.45 15
6 Bananas $3.45 30
Erwägen Sie, den folgenden Befehl auszuführen, der Lebensmittel, deren Menge kleiner oder gleich 20 ist, mit einem (*)-Zeichen am Ende jeder Zeile kennzeichnet:
awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; } $4 > 20 { print $0 ;}' food_list.txt
Der obige Befehl funktioniert tatsächlich wie folgt:
- Zuerst prüft es, ob die Menge, das vierte Feld jeder Eingabezeile kleiner oder gleich 20 ist, wenn ein Wert diese Bedingung erfüllt, wird er gedruckt und mit dem (
*)-Zeichen am Ende gekennzeichnet, wobei der erste Ausdruck verwendet wird:$4 <= 20 - Zweitens wird geprüft, ob das vierte Feld jeder Eingabezeile größer als 20 ist, und ob eine Zeile die Bedingung erfüllt, die sie mit dem zweiten Ausdruck ausgibt:
$4 > 20
Das Problem:
Aber es gibt hier ein Problem: Wenn der erste Ausdruck ausgeführt wird, wird eine Zeile, die wir markieren möchten, mit folgendem Befehl gedruckt: { printf "%s\t%s\n", $0,"**" ; } und dann wird im selben Schritt auch der zweite Ausdruck überprüft, was zu einem zeitraubenden Faktor wird.
Es ist also nicht notwendig, den zweiten Ausdruck, $4 > 20, erneut auszuführen, nachdem bereits markierte Zeilen gedruckt wurden, die mit dem ersten Ausdruck gedruckt wurden.
Optimierter Befehl mit next
Um dieses Problem zu beheben, müssen Sie den nächsten Befehl wie folgt verwenden:
awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; next; } $4 > 20 { print $0 ;}' food_list.txt
Und so funktioniert es:
- Wenn eine Zeile die Bedingung
$4 <= 20 erfüllt, druckt sie die Zeile mit einem Sternchen und überspringt dann als nächstes die verbleibenden Aktionen für diese Zeile und wechselt direkt zur nächsten Zeile. - Dadurch wird verhindert, dass die Bedingung
$4 >l 20für bereits verarbeitete Zeilen geprüft wird.
Beispiel 2: Filtern und Formatieren von Daten
Stellen Sie sich eine Datei data.txt mit folgendem Inhalt vor:
ID Name Age Score
1 Alice 30 85
2 Bob 25 90
3 Charlie 35 70
4 David 28 92
Wenn Sie nur Datensätze drucken möchten, bei denen die Punktzahl über 80 liegt, und sie als "Name: [Name], Punktzahl: [Punktzahl]" formatieren möchten, verwenden Sie Folgendes:
awk '$4 > 80 { printf "Name: %s, Score: %d\n", $2, $4; next; }' data.txt
Zusammenfassung
Die Verwendung des nächsten Befehls in awk ist eine leistungsstarke Möglichkeit, Ihre Datenverarbeitung zu rationalisieren, indem unnötige Auswertungen vermieden werden. Indem Sie den Rest des Skripts für bereits verarbeitete Zeilen überspringen, machen Sie Ihre awk-Skripte effizienter und schneller.
Für diejenigen, die eine umfassende Ressource suchen, haben wir alle Artikel der Awk-Serie in einem Buch zusammengestellt, das 13 Kapitel umfasst und sich über 41 Seiten erstreckt und sowohl die grundlegende als auch die fortgeschrittene Verwendung von Awk mit praktischen Beispielen abdeckt.
| Produktname | Preis | Kaufen |
|---|---|---|
| E-Book: Einführung in den AWK-Leitfaden für Anfänger | 8,99 $ | [Jetzt kaufen] |
Im nächsten Teil unserer awk-Serie werden wir untersuchen, wie Sie die Standardeingabe (STDIN) mit awk verwenden können. Bleiben Sie dran und zögern Sie wie immer, Ihre Gedanken und Fragen in den Kommentaren unten zu teilen!


