Com utilitzar la següent comanda amb Awk a Linux - Part 6


En aquesta sisena part de la sèrie d'Awk, veurem l'ús de l'ordre següent, que li diu a l'Awk que ometi tots els patrons i expressions restants que hàgiu proporcionat, però que llegeixi la següent línia d'entrada.

L'ordre següent us ajuda a evitar l'execució del que em referiria com a passos que fan perdre el temps en l'execució d'una ordre.

Per entendre com funciona, considerem un fitxer anomenat food_list.txt que té aquest aspecte:

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

Penseu en executar l'ordre següent que marcarà els aliments la quantitat dels quals sigui inferior o igual a 20 amb un signe (*) al final de cada línia:

# 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

L'ordre anterior funciona realment de la següent manera:

  1. Primer, comprova si la quantitat, el quart camp de cada línia d'entrada és menor o igual a 20, si un valor compleix aquesta condició, s'imprimeix i s'assenyala amb el signe (*) al final utilitzant l'expressió 1: $4 <= 20
  2. En segon lloc, comprova si el quart camp de cada línia d'entrada és superior a 20, i si una línia compleix la condició, s'imprimeix mitjançant l'expressió dos: $4 > 20

Però aquí hi ha un problema, quan s'executa la primera expressió, s'imprimeix una línia que volem marcar amb: { printf \%s\t%s\n\, $0,\**\ ; } i després en el mateix pas, també es verifica la segona expressió que es converteix en un factor de pèrdua de temps.

Per tant, no cal tornar a executar la segona expressió, $4 > 20 després d'imprimir les línies ja marcades que s'han imprès amb la primera expressió.

Per solucionar aquest problema, heu d'utilitzar l'ordre next de la següent manera:

# 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

Després d'imprimir una única línia d'entrada utilitzant $4 <= 20 { printf \%s\t%s\n\, $0,\*\ ; Pròxim ; }, l'ordre next inclosa ajudarà a saltar la segona expressió $4 > 20 { print $0 ;}, de manera que l'execució passa a la següent línia d'entrada sense haver de perdre temps en comprovar si la quantitat és superior a 20.

La següent ordre és molt important és escriure ordres eficients i, quan sigui necessari, sempre podeu utilitzar-la per accelerar l'execució d'un script. Prepareu-vos per a la següent part de la sèrie on veurem utilitzar l'entrada estàndard (STDIN) com a entrada per a Awk.

Espero que us sigui útil aquesta guia i, com sempre, pugueu posar els vostres pensaments per escrit deixant un comentari a la secció de comentaris a continuació.