Kuidas kasutada järgmist käsku Awkiga Linuxis - 6. osa


Awk-seeria selles kuuendas osas vaatleme käsku next , mis käsib Awkil vahele jätta kõik teie järelejäänud mustrid ja avaldised, kuid loeb selle asemel järgmise sisendjoone.

Käsk next aitab teil vältida käskude täitmisel viidatud aja raiskamise sammudena täitmist.

Tööpõhimõtte mõistmiseks kaaluge faili nimega food_list.txt, mis näeb välja selline:

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

Kaaluge järgmise käsu käivitamist, mis tähistab toiduaineid, mille kogus on väiksem või võrdne 20, iga rea lõpus tähisega (*) :

# 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

Ülaltoodud käsk töötab tegelikult järgmiselt:

  1. Kõigepealt kontrollitakse, kas iga sisendrea neljas väli on väiksem või võrdne 20-ga. Kui väärtus vastab sellele tingimusele, trükitakse see ja tähistatakse märgiga (*) lõpus väljendit üks kasutades: $4 <= 20
  2. Teiseks kontrollib see, kas iga sisendrea neljas väli on suurem kui 20 ja kas rida vastab tingimusele, mille see prinditakse, kasutades lauset kaks: $4> 20

Kuid siin on üks probleem, kui esimene avaldis on täidetud, trükitakse rida, mille tahame märgistada: {printf\"% s\t% s\n \", $0,\"**\"; } ja seejärel kontrollitakse samas etapis ka teist avaldist, millest saab aja raiskamistegur.

Seega pole vaja esimest lauset $4> 20 uuesti käivitada pärast juba märgistatud ridade printimist, mis on esimese avaldise abil prinditud.

Selle probleemi lahendamiseks peate kasutama käsku next järgmiselt:

# 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

Pärast ühe sisendjoone printimist kasutage $4 <= 20 {printf\"% s\t% s\n \", $0,\"* \"; järgmine; } , kaasatud käsk next aitab vahele jätta teise avaldise $4> 20 {print $0;} , nii et käivitamine läheb järgmine sisendrida, ilma et peaksite raiskama aega kontrollimiseks, kas kogus on suurem kui 20.

Järgmine käsk on tõhusate käskude kirjutamine ja vajaduse korral saate seda alati skripti täitmise kiirendamiseks kasutada. Valmistuge sarja järgmiseks osaks, kus vaatame Awki sisendina standardse sisendi (STDIN) kasutamist.

Loodetavasti leiate sellest juhendamise kasuliku ja võite oma mõtted alati kirjalikult panna, jättes kommentaari allpool olevasse kommentaaride jaotisesse.