Kako uporabiti naslednji ukaz s programom Awk v Linuxu - 6. del


V tem šestem delu serije Awk si bomo ogledali uporabo ukaza next , ki Awku pove, da preskoči vse preostale vzorce in izraze, ki ste jih navedli, vendar namesto tega prebere naslednjo vrstico vnosa.

Ukaz next vam pomaga pri preprečevanju izvajanja tega, kar bi pri izvedbi ukaza označil za zapravljanje časa.

Da bi razumeli, kako deluje, si oglejmo datoteko z imenom food_list.txt, ki je videti takole:

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

Razmislite o zagonu naslednjega ukaza, ki bo označil prehrambene izdelke, katerih količina je manjša ali enaka 20, z znakom (*) na koncu vsake vrstice:

# 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

Zgornji ukaz dejansko deluje na naslednji način:

  1. Najprej preveri, ali je količina, četrto polje vsake vnosne vrstice manjše ali enako 20, če vrednost izpolnjuje ta pogoj, se natisne in označi z znakom (*) na koncu z izrazom ena: $4 <= 20
  2. Drugič, preveri, ali je četrto polje vsake vhodne vrstice večje od 20 in če vrstica izpolnjuje pogoj, se natisne z izrazom dva: $4> 20

Toda tu je ena težava, ko se izvede prvi izraz, se vrstico, ki jo želimo označiti, natisne z uporabo: {printf\"% s\t% s\n \", $0,\"**\"; } in nato v istem koraku preverimo tudi drugi izraz, ki postane dejavnik zapravljanja časa.

Zato po ponovnem tiskanju že označenih vrstic, ki so bile natisnjene s prvim izrazom, drugega izraza $4> 20 ni treba znova zagnati.

Če želite odpraviti to težavo, morate uporabiti ukaz next , kot sledi:

# 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

Po tiskanju ene same vnosne vrstice uporabite $4 <= 20 {printf\"% s\t% s\n \", $0,\"* \"; Naslednji ; } , vključeni ukaz next bo pomagal preskočiti drugi izraz $4> 20 {print $0;} , zato se izvajanje izvede naslednjo vrstico za vnos, ne da bi morali izgubljati čas s preverjanjem, ali je količina večja od 20.

Naslednji ukaz je zelo pomemben, je pisanje učinkovitih ukazov in po potrebi lahko vedno uporabite za pospešitev izvajanja skripta. Pripravite se na naslednji del serije, kjer bomo pogledali uporabo standardnega vhoda (STDIN) kot vhoda za Awk.

Upam, da vam je to vodilo koristno in lahko svoje misli pisno izrazite tako, da pustite komentar v spodnjem oddelku za komentarje.