Website-Suche

So verwenden Sie Awk zum Filtern von Text oder Zeichenfolgen mithilfe musterspezifischer Aktionen


Im dritten Teil der Awk-Befehlsreihe werfen wir einen Blick auf das Filtern von Text oder Zeichenfolgen basierend auf bestimmten Mustern, die ein Benutzer definieren kann.

Manchmal möchten Sie beim Filtern von Text bestimmte Zeilen aus einer Eingabedatei oder Zeilen von Zeichenfolgen angeben, basierend auf einer bestimmten Bedingung oder unter Verwendung eines bestimmten Musters, das abgeglichen werden kann. Dies mit Awk zu tun ist sehr einfach, es ist eine der großartigen Funktionen von Awk, die Sie hilfreich finden werden.

Schauen wir uns unten ein Beispiel an: Angenommen, Sie haben eine Einkaufsliste für Lebensmittel, die Sie kaufen möchten, mit dem Namen food_prices.list. Es gibt die folgende Liste von Lebensmitteln und deren Preisen.

$ cat food_prices.list 
No	Item_Name		Quantity	Price
1	Mangoes			   10		$2.45
2	Apples			   20		$1.50
3	Bananas			   5		$0.90
4	Pineapples		   10		$3.46
5	Oranges			   10		$0.78
6	Tomatoes		   5		$0.55
7	Onions			   5            $0.45

Und dann möchten Sie ein (*)-Zeichen auf Lebensmitteln anbringen, deren Preis größer als $2 ist. Dies kann durch Ausführen des folgenden Befehls erfolgen:

awk '/ *$[2-9]\.[0-9][0-9] */ { print $1, $2, $3, $4, "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list

Aus der obigen Ausgabe können Sie ersehen, dass sich am Ende der Zeilen mit den Lebensmitteln Mangos und Ananas ein (*)-Zeichen befindet >. Wenn Sie sich die Preise ansehen, liegen sie über 2$.

In diesem Beispiel haben wir zwei Muster verwendet:

  1. Der erste: / *\$[2-9]\.[0-9][0-9] */ ruft die Zeilen ab, deren Lebensmittelpreis größer als 2$ ist und
  2. der zweite: /*\$[0-1]\.[0-9][0-9] */ sucht nach Zeilen mit einem Lebensmittelpreis von weniger als 2$ .

Das passiert, es gibt vier Felder in der Datei. Wenn Muster eins auf eine Zeile mit einem Lebensmittelpreis von mehr als 2$ trifft, werden alle vier Felder und ein (*) gedruckt. Zeichen am Ende der Zeile als Flag.

Das zweite Muster druckt einfach die anderen Zeilen mit einem Lebensmittelpreis von weniger als 2$ aus, wie sie in der Eingabedatei food_prices.list erscheinen.

Auf diese Weise können Sie musterspezifische Aktionen verwenden, um Lebensmittel herauszufiltern, deren Preis über 2$ liegt. Allerdings gibt es ein Problem mit der Ausgabe, nämlich den Zeilen, die den (*) haben Zeichen sind nicht wie die übrigen Zeilen formatiert, sodass die Ausgabe nicht klar genug ist.

Wir haben das gleiche Problem in Teil 2 der awk-Serie gesehen, aber wir können es auf zwei Arten lösen:

1. Verwenden des Befehls printf, was ein langer und langweiliger Weg ist, indem Sie den folgenden Befehl verwenden:

awk '/ *$[2-9]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4 "*" ; } / *$[0-1]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4; }' food_prices.list 

2. Verwendung des Feldes $0. Awk verwendet die Variable 0, um die gesamte Eingabezeile zu speichern. Dies ist praktisch, um das obige Problem zu lösen, und geht wie folgt einfach und schnell:

awk '/ *$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list 

Abschluss

Das ist es fürs Erste, und dies sind einfache Möglichkeiten zum Filtern von Text mithilfe einer musterspezifischen Aktion, die dabei helfen kann, Textzeilen oder Zeichenfolgen in einer Datei mit dem Befehl Awk zu kennzeichnen.

Ich hoffe, Sie finden diesen Artikel hilfreich und denken daran, den nächsten Teil der Serie zu lesen, der sich auf die Verwendung von Vergleichsoperatoren mit dem awk-Tool konzentriert.