Hvordan bruke 'neste' kommando med Awk i Linux - Del 6


I denne sjette delen av Awk-serien skal vi se på å bruke neste-kommandoen, som forteller Awk å hoppe over alle gjenværende mønstre og uttrykk som du har oppgitt, men i stedet lese neste inngangslinje.

Kommandoen neste hjelper deg med å forhindre kjøring av det jeg vil referere til som tidsødslende trinn i en kommandokjøring.

For å forstå hvordan det fungerer, la oss vurdere en fil kalt food_list.txt som ser slik ut:

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

Vurder å kjøre følgende kommando som vil flagge matvarer hvis mengde er mindre enn eller lik 20 med et (*)-tegn på slutten av hver linje:

# 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

Kommandoen ovenfor fungerer faktisk som følger:

  1. Først sjekker den om antallet, fjerde felt for hver inndatalinje er mindre enn eller lik 20, hvis en verdi oppfyller denne betingelsen, skrives den ut og flagges med (*) tegn på slutten med uttrykk en: $4 <= 20
  2. For det andre sjekker den om det fjerde feltet for hver inndatalinje er større enn 20, og om en linje oppfyller betingelsen blir den skrevet ut ved hjelp av uttrykk to: $4 > 20

Men det er ett problem her, når det første uttrykket utføres, skrives en linje som vi ønsker å flagge ut ved å bruke: { printf "%s\t%s\n", $0, "**" ; } og deretter i samme trinn sjekkes også andre uttrykk som blir en tidssløsende faktor.

Så det er ikke nødvendig å utføre det andre uttrykket, $4 > 20 igjen etter å ha skrevet ut allerede flaggede linjer som har blitt skrevet ut med det første uttrykket.

For å håndtere dette problemet, må du bruke kommandoen neste som følger:

# 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

Etter at en enkelt inndatalinje er skrevet ut med $4 <= 20 { printf "%s\t%s\n", $0,"*" ; neste ; }, vil kommandoen neste som er inkludert hjelpe til med å hoppe over det andre uttrykket $4 > 20 { print $0 ;}, så utførelsen går til neste inndatalinje uten å måtte kaste bort tid på å sjekke om mengden er større enn 20.

neste-kommandoen er veldig viktig er å skrive effektive kommandoer, og der det er nødvendig, kan du alltid bruke det til å fremskynde utførelsen av et skript. Forbered deg på neste del av serien hvor vi skal se på å bruke standard input (STDIN) som input for Awk.

Håper du finner denne veiledningen nyttig, og du kan som alltid skrive tankene dine ved å legge igjen en kommentar i kommentarfeltet nedenfor.