Zoeken op website

Hoe 'next'-commando te gebruiken met Awk in Linux - Deel 6


In dit zesde deel van de Awk-serie zullen we kijken naar het gebruik van het next-commando, dat Awk vertelt om alle resterende patronen en expressies die je hebt opgegeven over te slaan, maar in plaats daarvan de volgende te lezen invoerlijn.

Het next commando helpt je te voorkomen dat je tijdverspillende stappen bij het uitvoeren van een commando uitvoert.

Laten we, om te begrijpen hoe het werkt, eens kijken naar een bestand met de naam food_list.txt dat er als volgt uitziet:

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

Overweeg om de volgende opdracht uit te voeren, waarmee voedingsmiddelen waarvan de hoeveelheid kleiner is dan of gelijk is aan 20 worden gemarkeerd met een (*)-teken aan het einde van elke regel:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; } $4 > 20 { print $0 ;} ' food_list.txt 

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

Het bovenstaande commando werkt eigenlijk als volgt:

  1. Eerst wordt gecontroleerd of het vierde veld van elke invoerregel kleiner dan of gelijk is aan 20. Als een waarde aan die voorwaarde voldoet, wordt deze afgedrukt en gemarkeerd met de (*) teken aan het einde met expressie één: $4 <= 20
  2. Ten tweede controleert het of het vierde veld van elke invoerregel groter is dan 20, en of een regel aan de voorwaarde voldoet, wordt deze afgedrukt met expressie twee: $4 > 20

Maar er is hier één probleem: wanneer de eerste expressie wordt uitgevoerd, wordt een regel die we willen markeren afgedrukt met: { printf "%s\t%s\n", $0, "**"; } en vervolgens wordt in dezelfde stap ook de tweede expressie gecontroleerd, wat een tijdverspillende factor wordt.

Het is dus niet nodig om de tweede expressie, $4 > 20, nogmaals uit te voeren na het afdrukken van reeds gemarkeerde regels die zijn afgedrukt met de eerste expressie.

Om dit probleem op te lossen, moet je het next commando als volgt gebruiken:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; next; } $4 > 20 { print $0 ;} ' food_list.txt

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

Nadat een enkele invoerregel is afgedrukt met $4 <= 20 { printf "%s\t%s\n", $0,"*" ; volgende ; }, zal het meegeleverde next commando helpen de tweede expressie $4 > 20 { print $0 ;} over te slaan, dus de uitvoering gaat naar de volgende invoerregel zonder dat u tijd hoeft te verspillen aan het controleren of het aantal groter is dan 20.

Het volgende commando dat heel belangrijk is, is het schrijven van efficiënte commando's en waar nodig kun je dit altijd gebruiken om de uitvoering van een script te versnellen. Bereid je voor op het volgende deel van de serie, waarin we zullen kijken naar het gebruik van standaardinvoer (STDIN) als invoer voor Awk.

Ik hoop dat je deze handleiding nuttig vindt en dat je zoals altijd je gedachten op schrift kunt stellen door een reactie achter te laten in het commentaargedeelte hieronder.