Cum să utilizați comanda „următoarea” cu Awk în Linux - Partea 6


În această a șasea parte a seriei Awk, ne vom uita la utilizarea comenzii next, care îi spune Awk să omite toate modelele și expresiile rămase pe care le-ați furnizat, dar în schimb citiți următoarea linia de intrare.

Comanda next vă ajută să preveniți executarea a ceea ce eu m-aș referi ca pași care pierd timp în execuția unei comenzi.

Pentru a înțelege cum funcționează, să luăm în considerare un fișier numit food_list.txt care arată astfel:

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

Luați în considerare rularea următoarei comenzi care va semnala produsele alimentare a căror cantitate este mai mică sau egală cu 20 cu un semn (*) la sfârșitul fiecărei rânduri:

# 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

Comanda de mai sus funcționează de fapt după cum urmează:

  1. În primul rând, verifică dacă cantitatea, al patrulea câmp al fiecărei linii de intrare este mai mică sau egală cu 20, dacă o valoare îndeplinește această condiție, este tipărită și marcată cu (*) semnează la sfârșit folosind expresia unu: $4 <= 20
  2. În al doilea rând, verifică dacă al patrulea câmp al fiecărei linii de intrare este mai mare de 20, iar dacă o linie îndeplinește condiția, este tipărită folosind expresia doi: $4 > 20

Dar există o problemă aici, când se execută prima expresie, o linie pe care vrem să o semnalăm este tipărită folosind: { printf "%s\t%s\n", $0, "**"; } și apoi, în același pas, se verifică și a doua expresie care devine un factor de pierdere de timp.

Deci nu este nevoie să executați a doua expresie, $4 > 20 din nou după tipărirea liniilor deja marcate care au fost tipărite folosind prima expresie.

Pentru a rezolva această problemă, trebuie să utilizați comanda next după cum urmează:

# 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

După ce o singură linie de intrare este tipărită folosind $4 <= 20 { printf "%s\t%s\n", $0,"*" ; Următorul ; }, comanda next inclusă va ajuta să săriți peste a doua expresie $4 > 20 { print $0 ;}, deci execuția merge la următoarea linie de intrare fără a fi nevoie să pierdeți timpul verificând dacă cantitatea este mai mare de 20.

Comanda următoarea este foarte importantă este scrierea comenzilor eficiente și, acolo unde este necesar, o puteți folosi oricând pentru a accelera execuția unui script. Pregătiți-vă pentru următoarea parte a seriei în care vom analiza utilizarea intrării standard (STDIN) ca intrare pentru Awk.

Sper că veți găsi util acest ghid și puteți, ca întotdeauna, să vă exprimați gândurile în scris, lăsând un comentariu în secțiunea de comentarii de mai jos.