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:
- 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
- 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ó.