Zoeken op website

Hoe u Awk kunt gebruiken om tekst of tekenreeksen te filteren met behulp van patroonspecifieke acties


In het derde deel van de Awk-opdrachtenreeks zullen we kijken naar het filteren van tekst of tekenreeksen op basis van specifieke patronen die een gebruiker kan definiëren.

Soms wilt u bij het filteren van tekst bepaalde regels uit een invoerbestand of regels met tekenreeksen aangeven op basis van een bepaalde voorwaarde of met behulp van een specifiek patroon dat kan worden gekoppeld. Dit doen met Awk is heel eenvoudig; het is een van de geweldige functies van Awk die u nuttig zult vinden.

Laten we een voorbeeld hieronder bekijken. Stel dat u een boodschappenlijstje heeft voor voedselartikelen die u wilt kopen, genaamd food_prices.list. Het heeft de volgende lijst met voedselproducten en hun prijzen.

$ 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

En dan wil je een (*)-teken aanbrengen op voedselartikelen waarvan de prijs hoger is dan $2. Dit kun je doen door de volgende opdracht uit te voeren:

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

Uit de bovenstaande uitvoer kunt u zien dat er een (*)-teken aan het einde van de regels staat met voedselproducten, mango's en ananas >. Als je hun prijzen bekijkt, liggen ze boven € 2.

In dit voorbeeld hebben we twee patronen gebruikt:

  1. de eerste: / *\$[2-9]\.[0-9][0-9] */ haalt de regels op met een voedselprijs hoger dan $2 en
  2. de tweede: /*\$[0-1]\.[0-9][0-9] */ zoekt naar regels met een voedselprijs lager dan $2 .

Dit is wat er gebeurt. Er zijn vier velden in het bestand. Wanneer patroon één een regel tegenkomt met een voedselprijs hoger dan $2, worden alle vier de velden afgedrukt en een (*) teken aan het einde van de regel als een vlag.

Het tweede patroon drukt eenvoudigweg de andere regels af met een voedselprijs van minder dan $2 zoals deze verschijnen in het invoerbestand, food_prices.list.

Op deze manier kun je patroonspecifieke acties gebruiken om voedselproducten eruit te filteren die een prijs hebben van meer dan $2, hoewel er een probleem is met de uitvoer, de regels met de (*) teken zijn niet opgemaakt zoals de rest van de regels, waardoor de uitvoer niet duidelijk genoeg is.

Hetzelfde probleem zagen we in deel 2 van de awk-serie, maar we kunnen het op twee manieren oplossen:

1. Het printf commando gebruiken, wat een lange en saaie manier is om het onderstaande commando te gebruiken:

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. Gebruik het veld $0. Awk gebruikt de variabele 0 om de hele invoerregel op te slaan. Dit is handig om het bovenstaande probleem op te lossen en het gaat als volgt eenvoudig en snel:

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

Conclusie

Dat is het voor nu en dit zijn eenvoudige manieren om tekst te filteren met behulp van patroonspecifieke acties die kunnen helpen bij het markeren van tekstregels of tekenreeksen in een bestand met de opdracht Awk.

Ik hoop dat je dit artikel nuttig vindt en vergeet niet om het volgende deel van de serie te lezen, dat zich richt op het gebruik van vergelijkingsoperatoren met behulp van de awk-tool.